La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 05/12/2024 03:09:03


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
samhuin
Ecuyer
Inscrit le: 14 Nov 2005
Messages: 43
Répondre en citant
Posté le : 21/11/2005 15:28:42 Sujet du message : Repos[resolu]

Voila le script que j'utilise pour que mes perso se repose, tous marche bien sauf un petit detail, il ne detruit pas l'objet une fois celui si utiliser. je ne comprend pas d'ou vient le probleme. surement autour du destroy object.
Si quelqu'un pourrai me trouver l'erreur que j'ai faite se serait super.

NWScript :
//Confused//////////////////////// ////////////////////
//:: Created By: Jouby
//:: Created On: 2004
//Confused//////////////////////// ////////////////////

void ClearDarkness(object oOwner)//effacer l'effet du noir de l'ecran
{
  effect eTemp=GetFirstEffect(oOwner);
  effect eEcranNoir = EffectVisualEffect(VFX_DUR_BLACKOUT);
  while(GetIsEffectValid(eTemp))
  {
    if(GetEffectType(eTemp)==GetEffectType(eEcranNoir))
    {
      RemoveEffect(oOwner, eTemp);
    }
  eTemp=GetNextEffect(oOwner);
  }
}

/////////////////////////// ///////////////////
//Pas de repos sans nourriture//////////////////
//script du Troubadour//////////////////// /////
////////////////////////////// //////////////////
//Mode d'emploi : placer ce script dans le "OnRest" du module"//
//Creer un ou plusieurs objets non stackable portant le tag "BOUFFE"//

//Ce qui suit est une nouvelle fonction, elle n'est pas de moi//
//Elle cherche un item donne dans l'inventaire du PJ//

object CheckInventoryForItemToEat(object oPC)
{
  string sTag;
  object oItem = GetFirstItemInInventory (oPC);

  while (oItem != OBJECT_INVALID)
  {
    sTag = GetTag(oItem);
    if (( sTag == "BOUFFE") ||
      ( sTag == "cnrCherryPie") ||
      ( sTag == "cnrBlkberryPie") ||
      ( sTag == "cnrBluberryPie") ||
      ( sTag == "cnrApplePie") ||
      ( sTag == "cnrPecanPie") ||
      ( sTag == "cnrOatsBread") ||
      ( sTag == "cnrWheatBread") ||
      ( sTag == "cnrCornBread") ||
      ( sTag == "cnrRiceBread") ||
      ( sTag == "cnrRyeBread "))
    return oItem;

    oItem = GetNextItemInInventory (oPC);
  }
  return OBJECT_INVALID;
}

//VARIABLE MODIFIABLES
//Le nombres d'heure durant lequelles le joueurs doit attendre


int TIMEBETWEENRESTING=2;
//Le nombre reel de minutes qui correspond a 1 heure dans le jeu
int REALTIMEMINUTES=2;
//FIN DES VARIABLES MODIFIABLES
int CurrentTime();


void main()
{
  object oPC = GetLastPCRested();
  object oItemRequis = CheckInventoryForItemToEat(oPC);
  object oTarget = oPC;
  object oZone5 = GetArea(oPC);
  object oPlaceable = GetFirstObjectInArea(oZone5);
  string sTag = GetTag(oPlaceable);
  string sReposInterdit = "s3_repos_interdi";
  string sRepos_Interdit_animation = "A cause d'une animation en cours, le repos est interdit dans la zone pour raison de RP";
  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);

      //Lorsque le joueur click sur "se reposer" le script verifie la presence de l'item "bouffe"//
      //S'il n'y en a pas le repos est annule et un message envoye au joueur//
      if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
      {
        if (oItemRequis == OBJECT_INVALID)
        {
          SendMessageToPC (oPC, "Impossible de vous reposer avec cette faim qui vous tenaille...");
          AssignCommand (oPC,ClearAllActions());
        }
      //si l'item "bouffe" est present le repos est lance et un seul item de ce type detruit//
        else
        {
          while (GetIsObjectValid(oPlaceable))
          {
            if (sReposInterdit == sTag)
            {
              SendMessageToPC(oPC,sRepos_Interdit_animation);
              AssignCommand(oPC, ClearAllActions());
              return;
            }
            oPlaceable = GetNextObjectInArea(oZone5);
          }

          if (GetLastRestEventType()== REST_EVENTTYPE_REST_STARTED)
          {
            PlayVoiceChat(VOICE_CHAT_REST, oPC);
            ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_BLACKOUT), oTarget);
            ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_IMP_SLEEP), oTarget);
          }

          if (GetLastRestEventType()== REST_EVENTTYPE_REST_CANCELLED)
          {
            ClearDarkness(oTarget);
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oTarget, 30.0f);
            SendMessageToPC(oPC, "Le reveil suite a un repos interrompu est toujours tres difficile");
          }

          if (GetLastRestEventType()== REST_EVENTTYPE_REST_FINISHED)
          {
            ClearDarkness(oTarget);
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oTarget, 10.0f);
            SendMessageToPC(oPC, "S'arracher des bras de Sylune vous demande encore quelques instants");
          }
        }
      }
    }
    else
    {
      SetLocalInt(oPC, "REST_ALLOWED", FALSE);
      iTimeUntilRest = (TIMEBETWEENRESTING-iTimeSinceRest);
      if (REALTIMEMINUTES == 1)
      {
        iTimeUntilRest = FloatToInt(HoursToSeconds(iTimeUntilRest)/60);
       
        if (iTimeUntilRest == 1)
        {
          FloatingTextStringOnCreature("Vous devez attendre " + "1 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 " + "1 heure avant de pouvoir vous reposer", oPC);
        }
        else
        {
          FloatingTextStringOnCreature("Vous devez attendre "+IntToString(iTimeUntilRest)+
" heures avant de pouvoir vous reposer", oPC);
        }
      }
      //Annuler le repos
      AssignCommand(oPC,ClearAllActions());
    }
    break;

    case REST_EVENTTYPE_REST_CANCELLED:
    //variable sur le temps de repos
    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.
Dernière édition par samhuin le 22/11/2005 09:31:07; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes
Répondre en citant
Posté le : 21/11/2005 16:36:33 Sujet du message :

Il doit manquer qqchose dans ton script : j'ai eu beau chercher, je n'y ai trouvé aucune commande DestroyObject.

Donc ça ne risque pas de détruire Very Happy

EDIT : j'ai également édité ton code pour l'indenter correctement, parce que c'était assez obscur sinon
_________________
» Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 21/11/2005 17:34:26 Sujet du message :

Deja dit nous qu'est ce qu'on doit detruire ? (Tag, et quand est ce qu'il se detruit, s'il te plait)
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
samhuin
Ecuyer
Inscrit le: 14 Nov 2005
Messages: 43
Répondre en citant
Posté le : 21/11/2005 20:46:33 Sujet du message :

if (( sTag == "BOUFFE") ||
( sTag == "cnrCherryPie") ||
( sTag == "cnrBlkberryPie") ||
( sTag == "cnrBluberryPie") ||
( sTag == "cnrApplePie") ||
( sTag == "cnrPecanPie") ||
( sTag == "cnrOatsBread") ||
( sTag == "cnrWheatBread") ||
( sTag == "cnrCornBread") ||
( sTag == "cnrRiceBread") ||
( sTag == "cnrRyeBread "))



je doit detruire un de ces objets, celui une fois que celui ci a servis une fois pour se reposer
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 21/11/2005 20:59:14 Sujet du message :

Alors faut pas : un que tu le mette dans un "WHILE" et 2 tu a juste dire : DestroyObject(GetObjectByTag(sTag));, donc sTag representant l'item (GetTag(oItem))
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 21/11/2005 21:27:14 Sujet du message :

je pense que c'est là :

NWScript :

if (GetLastRestEventType()== REST_EVENTTYPE_REST_STARTED)
          {
            PlayVoiceChat(VOICE_CHAT_REST, oPC);
            ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_BLACKOUT), oTarget);
            ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_IMP_SLEEP), oTarget);
            DestroyObject(oItemRequis); //La ligne a rajouter
          }
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.


Ca devrait marcher, la commande c'est la bonne, j'ai juste un petit doute sur l'endroit ou la placer.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
samhuin
Ecuyer
Inscrit le: 14 Nov 2005
Messages: 43
Répondre en citant
Posté le : 22/11/2005 09:30:05 Sujet du message :

Parfait, ca marche merci beaucoup.
 
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 59.316ms