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...
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)
//:///////////////////////// ////////////////////
//:: 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(oOwner, eTemp);
}
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 oPC, string 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 iCurrentTime, iLastRestTime, iTimeSinceRest, iTimeUntilRest;
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==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//
object oItemRequis = CheckInventoryForItem(oPC, sItemTag);
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(oPC, ClearAllActions());
return;
}
oPlaceable = GetNextObjectInArea(oZone5);
}
DestroyObject(oItemRequis, 0.0);
PlayVoiceChat(VOICE_CHAT_REST, oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_BLACKOUT), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(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<0) iTimeSinceRest+= 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 :
//:///////////////////////// ////////////////////
//:: 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(oOwner, eTemp);
}
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 oPC, string 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 iCurrentTime, iLastRestTime, iTimeSinceRest, iTimeUntilRest;
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==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//
object oItemRequis = CheckInventoryForItem(oPC, sItemTag);
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(oPC, ClearAllActions());
return;
}
oPlaceable = GetNextObjectInArea(oZone5);
}
object oSheild = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
if (oSheild != OBJECT_INVALID || oWeapon != OBJECT_INVALID)
{
FloatingTextStringOnCreature("Vous n'allez pas dormir avec ça à la main !", oPC);
AssignCommand(oPC, ClearAllActions());
return;
}
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
int bIdentified = GetIdentified(oArmor);
SetIdentified(oArmor,FALSE);
int nType = -1;
switch (GetGoldPieceValue(oArmor))
{
case 1: nType = 0;
break; // None
case 5: nType = 1;
break; // Padded
case 10: nType = 2;
break; // Leather
case 15: nType = 3;
break; // Studded Leather / Hide
case 100: nType = 4;
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Intermédiare.", oPC);
break; // Chain Shirt / Scale Mail
case 150: nType = 5;
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Intermédiare.", oPC);
break; // Chainmail / Breastplate
case 200: nType = 6;
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Lourde.", oPC);
break; // Splint Mail / Banded Mail
case 600: nType = 7;
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Lourde.", oPC);
break; // Half-Plate
case 1500: nType = 8;
FloatingTextStringOnCreature("Vous ne pouvez vous reposer en armure Lourde.", oPC);
break; // Full Plate
}
// Restore the identified flag, and return armor type.
SetIdentified(oArmor, bIdentified);
if (nType > 3)
{
AssignCommand(oPC, ClearAllActions());
return;
}
DestroyObject(oItemRequis, 0.0);
PlayVoiceChat(VOICE_CHAT_REST, oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_BLACKOUT), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(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<0) iTimeSinceRest+= 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