Repos des pjs

Répondre
Partager Rechercher
bonjour,
une petite aide pour correction de script, merci

Code PHP:

Scenariser la phase de repos des pjs 

-
Apparaition de Zzzz sur la tete du dormeur 
-Ecran noir pour le dormeur 
-Effet de "lenteur" au reveil 
-Sommeil bloqué pour animation si un certain item present au sol 

But 
rendre le repos moins utilisable n'importe 
ou et n'
importe quand 


*/ 
//:///////////////////////// //////////////////// 
//:: Created By: Jouby 
//:: Created On: 2004 
//:///////////////////////// //////////////////// 

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(oOwnereTemp); 

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 CheckInventoryForItem(object oPCstring sItemTag

  
object oItem GetFirstItemInInventory (oPC); 
  while (
oItem != OBJECT_INVALID
  { 
    if (
GetTag(oItem) == sItemTag
      return 
oItem
    
oItem GetNextItemInInventory (oPC); 
  } 
  return 
OBJECT_INVALID

//VARIABLE MODIFIABLES 
//Le nombres d'heure durant lequelles le joueurs doit attendre 
//avant de pouvoir se reposer après un repos complet (defaut, 8 heures) 

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


void main()//fonction principale 


string sItemTag "BOUFFE"
object oPC GetLastPCRested(); 
object oItemRequis CheckInventoryForItem(oPCsItemTag); 
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 iCurrentTimeiLastRestTimeiTimeSinceRestiTimeUntilRest
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==|| 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 (
GetItemPossessedBy(oPC,"BOUFFE") == 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 
        { 
        
DestroyObject(oItemRequis0.0); 


while (
GetIsObjectValid(oPlaceable)) 

if (
sReposInterdit == sTag

SendMessageToPC(oPC,sRepos_Interdit_animation); 
AssignCommand(oPCClearAllActions()); 
return; 

oPlaceable GetNextObjectInArea(oZone5); 




if (
GetLastRestEventType()== REST_EVENTTYPE_REST_STARTED

PlayVoiceChat(VOICE_CHAT_RESToPC); 
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_DUR_BLACKOUT), oTarget); 
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_SLEEP), oTarget); 


if (
GetLastRestEventType()== REST_EVENTTYPE_REST_CANCELLED

ClearDarkness(oTarget); 
ApplyEffectToObject(DURATION_TYPE_TEMPORARYEffectSlow(), oTarget30.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_TEMPORARYEffectSlow(), oTarget10.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); 
//Vous pouvez changer le message si le repos n'est pas encore 
//autoriser 
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<0iTimeSinceRest+= 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(); 

au lieu que ce sois bouffe j'aurais préféré mettre (tarte,viande,poisson)
En gros remplacé "bouffe" par "tarte"
Rajouté d'autres choses a mangé viande + poisson
Tu peux créer les objets que tu veux du moment que leur tag est "BOUFFE".
Citation :
Publié par Listing de script
//Mode d'emploi : placer ce script dans le "OnRest" du module"//
//Creer un ou plusieurs objets non stackable portant le tag "BOUFFE"//
Non stackable, parce que le script ne gère pas la pile d'objets.
comment le compilé avec celui la ? , merci bien

Code PHP:

#include "x2_inc_restsys"  
#include "x2_inc_switches"  
void main()  
{  
    
object oPC GetLastPCRested();  
    
object oArmor GetItemInSlot(INVENTORY_SLOT_CHESToPC);  
    
object oSheild GetItemInSlot(INVENTORY_SLOT_LEFTHANDoPC);  
    
object oWeapon GetItemInSlot(INVENTORY_SLOT_RIGHTHANDoPC);  
    
int bIdentified GetIdentified(oArmor);  

        if (
GetLastRestEventType()==REST_EVENTTYPE_REST_STARTED)  
        {  

            
SetIdentified(oArmor,FALSE);  
            
int nType = -1;  

            switch (
GetGoldPieceValue(oArmor))  
            {  
                case    
1nType 0;  
                    break; 
// None  

                
case    5nType 1;  
                    break; 
// Padded  

                
case   10nType 2;  
                    break; 
// Leather  

                
case   15nType 3;  
                    break; 
// Studded Leather / Hide  

                
case  100nType 4;  
                    
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Intermédiare."oPC);  
                    break; 
// Chain Shirt / Scale Mail  

                
case  150nType 5;  
                    
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Intermédiare."oPC);  
                    break; 
// Chainmail / Breastplate  

                
case  200nType 6;  
                    
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Lourde."oPC);  
                    break; 
// Splint Mail / Banded Mail  

                
case  600nType 7;  
                    
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Lourde."oPC);  
                    break; 
// Half-Plate  

                
case 1500nType 8;  
                    
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Lourde."oPC);  
                    break; 
// Full Plate  
            
}  
            
// Restore the identified flag, and return armor type.  
            
SetIdentified(oArmorbIdentified);  

             if (
oSheild != OBJECT_INVALID || oWeapon != OBJECT_INVALID)  
             {  
                
FloatingTextStringOnCreature("Vous n'allez pas dormir avec ça à la main !"oPC);  
                
AssignCommand(oPCClearAllActions());  
                return;  
             }  

             if (
nType 3)  
             {  
                
AssignCommand(oPCClearAllActions());  
                return;  
             }  


        }  

        else if (
GetLastRestEventType()==REST_EVENTTYPE_REST_CANCELLED)  
        {  
         
// No longer used but left in for the community  
         // WMFinishPlayerRest(oPC,TRUE); // removes sleep effect, etc  
        
}  

        else if (
GetLastRestEventType()==REST_EVENTTYPE_REST_FINISHED)  
        {  
         
// No longer used but left in for the community  
         //   WMFinishPlayerRest(oPC); // removes sleep effect, etc  
        
}  

Tu peux mettre :

ExecuteScript(OBJECT_SELF, "nom du 2e script");

à la fin du premier script.

C'est pas très clean mais ça devrais marcher

Sinon pour bien mélanger les 2 il faudrais commencer par nettoyer un peu les scripts, les rendre plus clair etc. bref assez laborieux.


PS: quand je dis "à la fin du premier script", ça veut dire juste avant l'accolade qui ferme la fonction void main().

Genre :
Code PHP:

void main() {

    
blabla
    je suis un script pas optimisé 
!
    
blabla

    ExecuteScript
(...);

Code PHP:

//:///////////////////////// ////////////////////
//:: Created By: Jouby
//:: Created On: 2004
//:///////////////////////// ////////////////////

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(oOwnereTemp);
}
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 CheckInventoryForItem(object oPCstring sItemTag)
{
  
object oItem GetFirstItemInInventory (oPC);
  while (
oItem != OBJECT_INVALID)
  {
    if (
GetTag(oItem) == sItemTag)
      return 
oItem;
    
oItem GetNextItemInInventory (oPC);
  }
  return 
OBJECT_INVALID;
}
//VARIABLE MODIFIABLES
//Le nombres d'heure durant lequelles le joueurs doit attendre
//avant de pouvoir se reposer après un repos complet (defaut, 8 heures)

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


void main()//fonction principale

{
string sItemTag "BOUFFE";
object oPC GetLastPCRested();
object oItemRequis CheckInventoryForItem(oPCsItemTag);
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 iCurrentTimeiLastRestTimeiTimeSinceRestiTimeUntilRest;
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==|| 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 (
GetItemPossessedBy(oPC,"BOUFFE") == 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
        {
        
DestroyObject(oItemRequis0.0);


while (
GetIsObjectValid(oPlaceable))
{
if (
sReposInterdit == sTag)
{
SendMessageToPC(oPC,sRepos_Interdit_animation);
AssignCommand(oPCClearAllActions());
return;
}
oPlaceable GetNextObjectInArea(oZone5);
}



if (
GetLastRestEventType()== REST_EVENTTYPE_REST_STARTED)
{
PlayVoiceChat(VOICE_CHAT_RESToPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_DUR_BLACKOUT), oTarget);
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_SLEEP), oTarget);
}

if (
GetLastRestEventType()== REST_EVENTTYPE_REST_CANCELLED)
{
ClearDarkness(oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARYEffectSlow(), oTarget30.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_TEMPORARYEffectSlow(), oTarget10.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);
//Vous pouvez changer le message si le repos n'est pas encore
//autoriser
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<0iTimeSinceRest+= 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();
}

{
  
void main() { 

 
ExecuteScript(OBJECT_SELF"ej_armes_armures");
}  



voila ce que sa me dit

ej_repos.nss(208): ERREUR : INVALID DECLARATION TYPE
Normal, ton erreur de compilation. En ligne 208, tu ouvre un {, et sans aucune déclaration de type void main(). De plus, en ligne 206, tu as déjà le } final du script. Du coup l'éditeur ne sais pas quoi faire.

Il faudrai que tu apprennes comment faire pour bien structurer un script afin de ne plus avoir ce genre de problème basique. Regardes les tutos, les exemples du Lexicon, .... Regardes aussi ton message d'erreur (pas toujours clair, je te l'accorde) : il t'indique le type d'erreur, qui doit te permettre de debugger ton script.


Au début, je ne connaissait rien sur la structure des scripts NWN, PHP. Et j'ai regardé, testé et modifié les exemples du Lexicon, les tutos de ce forum. Maintenant j'applique ce que j'ai appris à mon projet de module.
Code PHP:

//:///////////////////////// ////////////////////
//:: Created By: Jouby
//:: Created On: 2004
//:///////////////////////// ////////////////////

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(oOwnereTemp);
}
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 CheckInventoryForItem(object oPCstring sItemTag)
{
  
object oItem GetFirstItemInInventory (oPC);
  while (
oItem != OBJECT_INVALID)
  {
    if (
GetTag(oItem) == sItemTag)
      return 
oItem;
    
oItem GetNextItemInInventory (oPC);
  }
  return 
OBJECT_INVALID;
}
//VARIABLE MODIFIABLES
//Le nombres d'heure durant lequelles le joueurs doit attendre
//avant de pouvoir se reposer après un repos complet (defaut, 8 heures)

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


void main()//fonction principale

{
string sItemTag "BOUFFE";
object oPC GetLastPCRested();
object oItemRequis CheckInventoryForItem(oPCsItemTag);
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 iCurrentTimeiLastRestTimeiTimeSinceRestiTimeUntilRest;
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==|| 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 (
GetItemPossessedBy(oPC,"BOUFFE") == 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
        {
        
DestroyObject(oItemRequis0.0);


while (
GetIsObjectValid(oPlaceable))
{
if (
sReposInterdit == sTag)
{
SendMessageToPC(oPC,sRepos_Interdit_animation);
AssignCommand(oPCClearAllActions());
return;
}
oPlaceable GetNextObjectInArea(oZone5);
}



if (
GetLastRestEventType()== REST_EVENTTYPE_REST_STARTED)
{
PlayVoiceChat(VOICE_CHAT_RESToPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_DUR_BLACKOUT), oTarget);
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_SLEEP), oTarget);
}

if (
GetLastRestEventType()== REST_EVENTTYPE_REST_CANCELLED)
{
ClearDarkness(oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARYEffectSlow(), oTarget30.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_TEMPORARYEffectSlow(), oTarget10.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);
//Vous pouvez changer le message si le repos n'est pas encore
//autoriser
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<0iTimeSinceRest+= 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();
}

{

  
void main() {

 
ExecuteScript(OBJECT_SELF"ej_armes_armures");

ej_rest_ration2.nss(208): ERREUR : INVALID DECLARATION TYPE

et si j'enleve le { a la ligne 208 sa me dit

ej_rest_ration2.nss: ERREUR : DUPLICATE FUNCTION IMPLEMENTATION (main)

Void main est déclaré 2 fois si j'ai bien compris
Oui, tu as bien compris ce message.

Le void main() existe déjà en ligne 51 : dans un script, tu ne peux pas déclarer 2 fois la même fonction. Qui plus est un void main() qui représente le corps principal du script.


Pour le ExecuteScript, tu devrais vérifier l'ordre des paramètres. C'est :

ExecuteScript("mon_script", MonObjet);

et quand "mon_script" est lancé via ExecuteScript, MonObjet=OBJECT_SELF, à l'intérieur.


Quant à la commande :
Code PHP:

ExecuteScript("ej_armes_armures"OBJECT_SELF); 

je ne vois pas trop où tu veux la mettre dans ton script, ni ce que représente OBJECT_SELF, car nulle part ailleurs il n'est mentionné dans ton script.

Je suppose que c'est un script "Sans armes, ni armures" mais si tu le places tel quel dans le script de repos, cela n'empêchera pas le repos, même si le PJ possède une armure sur lui.


J'ai refais une mise en page de ton script pour qu'il soit plus lisible, et ajouté quelques commentaires sur les {} pour que tu comprenne un peu mieux la structure du script. Mais je n'ai pas corrigé tes erreurs car, comme je l'ai dit, je ne vois pas trop où tu veux en venir avec ton ExecuteScript.


Code PHP:

//:///////////////////////// ////////////////////
//:: Created By: Jouby
//:: Created On: 2004
//:///////////////////////// ////////////////////
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(oOwnereTemp);
      }
     
eTemp=GetNextEffect(oOwner);
    }
}
//Fin fonction ClearDarkness
 
 
/////////////////////////// ///////////////////
//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 CheckInventoryForItem(object oPCstring sItemTag)
{
  
object oItem GetFirstItemInInventory (oPC);
  while (
oItem != OBJECT_INVALID)
  {
    if (
GetTag(oItem) == sItemTag) return oItem;
    
oItem GetNextItemInInventory (oPC);
  }
  return 
OBJECT_INVALID;
}
//Fin Fonction CheckInventoryForItem
 
 
//VARIABLE MODIFIABLES
//Le nombres d'heure durant lequelles le joueurs doit attendre
//avant de pouvoir se reposer après un repos complet (defaut, 8 heures)
int TIMEBETWEENRESTING=6;
//Le nombre reel de minutes qui correspond a 1 heure dans le jeu
int REALTIMEMINUTES=2;
//FIN DES VARIABLES MODIFIABLES
int CurrentTime();
 
 
void main()//fonction principale
{
  
string sItemTag "BOUFFE";
  
object oPC GetLastPCRested();
  
object oItemRequis CheckInventoryForItem(oPCsItemTag);
  
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 iCurrentTimeiLastRestTimeiTimeSinceRestiTimeUntilRest;
  
float fTimePenalty;
  switch (
GetLastRestEventType())
   {
//Evenements du repos
    
case REST_EVENTTYPE_REST_STARTED:
    
iCurrentTime CurrentTime();
    
iLastRestTime GetLocalInt(oPC,"REST_HOUR");
    
iTimeSinceRest iCurrentTime-iLastRestTime;
    
SetLocalInt(oPC"REST_SECOND"GetTimeSecond());
    if (
iLastRestTime==|| 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 (
GetItemPossessedBy(oPC,"BOUFFE") == 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
             {
              
DestroyObject(oItemRequis0.0);
              while (
GetIsObjectValid(oPlaceable))
                {
                 if (
sReposInterdit == sTag)
                   {
                    
SendMessageToPC(oPC,sRepos_Interdit_animation);
                    
AssignCommand(oPCClearAllActions());
                    return;
                   }
                 
oPlaceable GetNextObjectInArea(oZone5);
                }
              if (
GetLastRestEventType()== REST_EVENTTYPE_REST_STARTED)
                {
                 
PlayVoiceChat(VOICE_CHAT_RESToPC);
                 
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_DUR_BLACKOUT), oTarget);
                 
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_SLEEP), oTarget);
                }
              if (
GetLastRestEventType()== REST_EVENTTYPE_REST_CANCELLED)
                {
                 
ClearDarkness(oTarget);
                 
ApplyEffectToObject(DURATION_TYPE_TEMPORARYEffectSlow(), oTarget30.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_TEMPORARYEffectSlow(), oTarget10.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);
           
//Vous pouvez changer le message si le repos n'est pas encore
           //autoriser
           
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());
       }
//Fin REST_EVENTTYPE_REST_STARTED
    
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<0iTimeSinceRest+= 60;
       
fTimePenalty TIMEBETWEENRESTING*(iTimeSinceRest/(0.5*GetHitDice(oPC)+10));
       
SetLocalInt(oPC,"REST_HOUR"CurrentTime()-(TIMEBETWEENRESTING-FloatToInt(fTimePenalty)));
      }
//Fin REST_EVENTTYPE_REST_CANCELLED
    
break;
    case 
REST_EVENTTYPE_REST_FINISHED:
    
SetLocalInt(oPC"REST_HOUR"CurrentTime());
   }
//Fin des Evenements du repos (Switch)
}//Fin Fonction principale (void main())
 
 
int CurrentTime()
{
  return 
GetCalendarYear()*8064 GetCalendarMonth()*672 GetCalendarDay()*24 GetTimeHour();
}
//Fin Fonction CurrentTime
 
 
{
  
void main() {
 
ExecuteScript(OBJECT_SELF"ej_armes_armures");

C'est pour eviter de faire une compilation avec le script sans armes n'y armures quand ont dort, Taern m'a dit de placer ExecuteScript(OBJECT_SELF, "ej_armes_armures"); a la fin du void main , une fois compilé il est censé déclencher le script "ej_armes_armures" donc pas de repos si ont porte une armure ou une arme enfin j'espere
Cela n'empêchera pas le repos si tu portes une armure ou une arme, car ce script cherche un objet ayant le tag "BOUFFE". Si cet objet est trouvé, le repos est déclenché. Et ce, même si tu exécutes la commande ExecuteScript("ej_armes_armures", OBJECT_SELF);

Telle quelle, la commande s'exécutera, cela te dira que tu ne peux pas dormir avec une armure ou une armes, c'est tout. Mais le PJ se sera reposé avant d'avoir eu ce message car il avait un objet "BOUFFE" qui a déclenché le repos.
Vidéo
comme dit Taern deja il faudrait peut etre commencer par nettoyer chacun des scripts...

Le premier est deja de base assez pourris...
A priori et selon la logique si dans un switch on rentre sur un cas X je vois vraiment pas pourquoi on retrouve des tests sur les cas a l'interieure des cases...

Code PHP:

    switch (GetLastRestEventType())
    {
//Evenements du repos
        
case REST_EVENTTYPE_REST_STARTED:

...
                     if (
GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
                        {
...
              break; 
puis a l'interieure du if on recommence le meme test au cas ou et on test meme les autres valeurs, on sait jamais si la variable change durant l'execution...

donc deja nettoye car dans l'etat actuel du truc, il y a toute une partie du script qui n'est strictement jamais utilise.

De base tu devrais avoir le meme resultat que ton premier script rien qu'avec cela (aux erreurs de compil pret... j'ai pas compile)
Code PHP:

//:///////////////////////// ////////////////////
//:: Created By: Jouby
//:: Created On: 2004
//:///////////////////////// ////////////////////
void ClearDarkness(object oOwner)//effacer l'effet du noir de l'ecran
{
    
effect eTemp=GetFirstEffect(oOwner);
    
int nTypeEcranNoir GetEffectType(EffectVisualEffect(VFX_DUR_BLACKOUT));
    while(
GetIsEffectValid(eTemp))
    {
        if (
GetEffectType(eTemp)==nTypeEcranNoir)
        {
            
RemoveEffect(oOwnereTemp);
        }
        
eTemp=GetNextEffect(oOwner);
    }
}
//Fin fonction ClearDarkness
 
 
/////////////////////////// ///////////////////
//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 CheckInventoryForItem(object oPCstring sItemTag)
{
    
object oItem GetFirstItemInInventory (oPC);
    while (
oItem != OBJECT_INVALID)
    {
        if (
GetTag(oItem) == sItemTag) return oItem;
        
oItem GetNextItemInInventory (oPC);
    }
    return 
OBJECT_INVALID;
}
//Fin Fonction CheckInventoryForItem
 
 
//VARIABLE MODIFIABLES
//Le nombres d'heure durant lequelles le joueurs doit attendre
//avant de pouvoir se reposer après un repos complet (defaut, 8 heures)
int TIMEBETWEENRESTING=6;
//Le nombre reel de minutes qui correspond a 1 heure dans le jeu
int REALTIMEMINUTES=2;
//FIN DES VARIABLES MODIFIABLES
int CurrentTime();
 
 
void main()//fonction principale
{
    
string sItemTag "BOUFFE";
    
object oPC GetLastPCRested();

    
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 iCurrentTimeiLastRestTimeiTimeSinceRestiTimeUntilRest;
    
float fTimePenalty;
    switch (
GetLastRestEventType())
    {
//Evenements du repos
        
case REST_EVENTTYPE_REST_STARTED:
            
iCurrentTime CurrentTime();
            
iLastRestTime GetLocalInt(oPC,"REST_HOUR");
            
iTimeSinceRest iCurrentTime-iLastRestTime;
            
SetLocalInt(oPC"REST_SECOND"GetTimeSecond());
            if (
iLastRestTime==|| 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//
                
object oItemRequis CheckInventoryForItem(oPCsItemTag);                
                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
                {
                    
string sTag;
                    
object oZone5 GetArea(oPC);
                    
object oPlaceable GetFirstObjectInArea(oZone5);
                    while (
GetIsObjectValid(oPlaceable))
                    {
                        
sTag GetTag(oPlaceable);
                        if (
sReposInterdit == sTag)
                        {
                            
SendMessageToPC(oPC,sRepos_Interdit_animation);
                            
AssignCommand(oPCClearAllActions());
                            return;
                        }
                        
oPlaceable GetNextObjectInArea(oZone5);
                    }
                    
DestroyObject(oItemRequis0.0);
                    
PlayVoiceChat(VOICE_CHAT_RESToPC);
                    
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_DUR_BLACKOUT), oPC);
                    
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_SLEEP), oPC);

                }
            }
            else
            {
                
SetLocalInt(oPC"REST_ALLOWED"FALSE);
                
iTimeUntilRest = (TIMEBETWEENRESTING-iTimeSinceRest);
                if (
REALTIMEMINUTES == 1)
                {
                    
iTimeUntilRest FloatToInt(HoursToSeconds(iTimeUntilRest)/60);
                }
                
//Vous pouvez changer le message si le repos n'est pas encore
                //autoriser
                
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());
            }
//Fin REST_EVENTTYPE_REST_STARTED
            
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<0iTimeSinceRest+= 60;
                
fTimePenalty TIMEBETWEENRESTING*(iTimeSinceRest/(0.5*GetHitDice(oPC)+10));
                
SetLocalInt(oPC,"REST_HOUR"CurrentTime()-(TIMEBETWEENRESTING-FloatToInt(fTimePenalty)));
            }
//Fin REST_EVENTTYPE_REST_CANCELLED
        
            
break;
        case 
REST_EVENTTYPE_REST_FINISHED:
            
SetLocalInt(oPC"REST_HOUR"CurrentTime());
    }
//Fin des Evenements du repos (Switch)
}//Fin Fonction principale (void main())
 

int CurrentTime()
{
    return 
GetCalendarYear()*8064 GetCalendarMonth()*672 GetCalendarDay()*24 GetTimeHour();
}
//Fin Fonction CurrentTime 
Verifie si tu as le meme resultat mais en toute logique normalement ca devrait donner la meme chose...

Ton second script est plus propre...

En gros le cumul des deux devrait donner un truc du style :
Code PHP:

//:///////////////////////// ////////////////////
//:: Created By: Jouby
//:: Created On: 2004
//:///////////////////////// ////////////////////

void ClearDarkness(object oOwner)//effacer l'effet du noir de l'ecran
{
    
effect eTemp=GetFirstEffect(oOwner);
    
int nTypeEcranNoir GetEffectType(EffectVisualEffect(VFX_DUR_BLACKOUT));
    while(
GetIsEffectValid(eTemp))
    {
        if (
GetEffectType(eTemp)==nTypeEcranNoir)
        {
            
RemoveEffect(oOwnereTemp);
        }
        
eTemp=GetNextEffect(oOwner);
    }
}
//Fin fonction ClearDarkness
 
 
/////////////////////////// ///////////////////
//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 CheckInventoryForItem(object oPCstring sItemTag)
{
    
object oItem GetFirstItemInInventory (oPC);
    while (
oItem != OBJECT_INVALID)
    {
        if (
GetTag(oItem) == sItemTag) return oItem;
        
oItem GetNextItemInInventory (oPC);
    }
    return 
OBJECT_INVALID;
}
//Fin Fonction CheckInventoryForItem
 
 
//VARIABLE MODIFIABLES
//Le nombres d'heure durant lequelles le joueurs doit attendre
//avant de pouvoir se reposer après un repos complet (defaut, 8 heures)
int TIMEBETWEENRESTING=6;
//Le nombre reel de minutes qui correspond a 1 heure dans le jeu
int REALTIMEMINUTES=2;
//FIN DES VARIABLES MODIFIABLES
int CurrentTime();
 
 
void main()//fonction principale
{
    
string sItemTag "BOUFFE";
    
object oPC GetLastPCRested();

    
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 iCurrentTimeiLastRestTimeiTimeSinceRestiTimeUntilRest;
    
float fTimePenalty;
    switch (
GetLastRestEventType())
    {
//Evenements du repos
        
case REST_EVENTTYPE_REST_STARTED:
            
iCurrentTime CurrentTime();
            
iLastRestTime GetLocalInt(oPC,"REST_HOUR");
            
iTimeSinceRest iCurrentTime-iLastRestTime;
            
SetLocalInt(oPC"REST_SECOND"GetTimeSecond());
            if (
iLastRestTime==|| 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//
                
object oItemRequis CheckInventoryForItem(oPCsItemTag);                
                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
                {
                    
// Verification si repos possible en fonction de la zone et d'un placeable interdisant le repos
                    
string sTag;
                    
object oZone5 GetArea(oPC);
                    
object oPlaceable GetFirstObjectInArea(oZone5);
                    while (
GetIsObjectValid(oPlaceable))
                    {
                        
sTag GetTag(oPlaceable);
                        if (
sReposInterdit == sTag)
                        {
                            
SendMessageToPC(oPC,sRepos_Interdit_animation);
                            
AssignCommand(oPCClearAllActions());
                            return;
                        }
                        
oPlaceable GetNextObjectInArea(oZone5);
                    }

                    
object oSheild GetItemInSlot(INVENTORY_SLOT_LEFTHANDoPC);  
                    
object oWeapon GetItemInSlot(INVENTORY_SLOT_RIGHTHANDoPC);  
        
                    if (
oSheild != OBJECT_INVALID || oWeapon != OBJECT_INVALID)  
                    {  
                        
FloatingTextStringOnCreature("Vous n'allez pas dormir avec ça à la main !"oPC);  
                        
AssignCommand(oPCClearAllActions());  
                        return;  
                    } 

                    
object oArmor GetItemInSlot(INVENTORY_SLOT_CHESToPC);               
                    
int bIdentified GetIdentified(oArmor);          
                    
SetIdentified(oArmor,FALSE);  
                    
int nType = -1;  

                    switch (
GetGoldPieceValue(oArmor))  
                    {  
                    case    
1nType 0;  
                        break; 
// None  
                    
case    5nType 1;  
                        break; 
// Padded  
                    
case   10nType 2;  
                        break; 
// Leather  
                    
case   15nType 3;  
                        break; 
// Studded Leather / Hide  
                    
case  100nType 4;  
                        
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Intermédiare."oPC);  
                        break; 
// Chain Shirt / Scale Mail  
                    
case  150nType 5;  
                        
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Intermédiare."oPC);  
                        break; 
// Chainmail / Breastplate  
                    
case  200nType 6;  
                        
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Lourde."oPC);  
                        break; 
// Splint Mail / Banded Mail  
                    
case  600nType 7;  
                        
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Lourde."oPC);  
                        break; 
// Half-Plate  
                    
case 1500nType 8;  
                        
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Lourde."oPC);  
                        break; 
// Full Plate  
                    
}  
                    
// Restore the identified flag, and return armor type.  
                    
SetIdentified(oArmorbIdentified);  
                    if (
nType 3)  
                    {  
                        
AssignCommand(oPCClearAllActions());  
                        return;  
                    }  

                    
DestroyObject(oItemRequis0.0);
                    
PlayVoiceChat(VOICE_CHAT_RESToPC);
                    
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_DUR_BLACKOUT), oPC);
                    
ApplyEffectToObject(DURATION_TYPE_PERMANENTEffectVisualEffect(VFX_IMP_SLEEP), oPC);
                }
            }
            else
            {
                
SetLocalInt(oPC"REST_ALLOWED"FALSE);
                
iTimeUntilRest = (TIMEBETWEENRESTING-iTimeSinceRest);
                if (
REALTIMEMINUTES == 1)
                {
                    
iTimeUntilRest FloatToInt(HoursToSeconds(iTimeUntilRest)/60);
                }
                
//Vous pouvez changer le message si le repos n'est pas encore
                //autoriser
                
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());
            }
//Fin REST_EVENTTYPE_REST_STARTED
            
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<0iTimeSinceRest+= 60;
                
fTimePenalty TIMEBETWEENRESTING*(iTimeSinceRest/(0.5*GetHitDice(oPC)+10));
                
SetLocalInt(oPC,"REST_HOUR"CurrentTime()-(TIMEBETWEENRESTING-FloatToInt(fTimePenalty)));
            }
//Fin REST_EVENTTYPE_REST_CANCELLED
        
            
break;
        case 
REST_EVENTTYPE_REST_FINISHED:
            
SetLocalInt(oPC"REST_HOUR"CurrentTime());
    }
//Fin des Evenements du repos (Switch)
}//Fin Fonction principale (void main())
 

int CurrentTime()
{
    return 
GetCalendarYear()*8064 GetCalendarMonth()*672 GetCalendarDay()*24 GetTimeHour();
}
//Fin Fonction CurrentTime 
Répondre

Connectés sur ce fil

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