La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 05/08/2025 21:30:45


  Page 2 sur 2 ¤ Aller à la page Précédente  1, 2

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 28/01/2006 13:59:42 Sujet du message :

Oki, merci L'erudit !
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 28/01/2006 14:58:13 Sujet du message :

Hmmm...

Je suis pas convaincu que ça marche du tout (je sais je suis chiant Very Happy).

D'une part :
Citation :
int h = GetTimeHour();
int i = 30*3600;
donc h est une entier entre 0 et 23 et i = 108000
Si après tu fais :
Citation :
j = (18/i)- (h/i);
comme j est un entier, le moteur va arrondir à l'entier le plus proche soit 0 dans tous les cas.
La même chose se produit ensuite pour k.
Donc tous tes DelayCommand ont de fortes chances de s'executer immédiatement.

En fait, je pense qu'il faudrait aborder le problème différement et ne pas programmer l'ouverture de la porte par ce script. D'une part, mieux vaut réduire au maximum le nombre de DelayCommand, qui bouffent tous de la ressource, surtout si tu les programmes aussi longs. Ensuite, tu as déjà un script qui fait fermer la porte avec le tavernier, donc pour l'ouvrir vérifie juste si l'heure est bonne sur le OnFailedToOpen, si c'est ok dévérouille et c'est tout, sinon envoie un message.

Ou place un trigger vers la porte qui fait la même chose, comme ça il n'y aura pas de latence, la porte sera trouvée ouverte ou fermée selon l'heure.

par exemple :
NWScript :

//sur un trigger a proximite de la porte
void main()
{
object oDoor = //recuperer la porte par son tag ou autre
SetLocked(oDoor,GetIsDay());

}
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.


D'autre part, quand tu manipules les durées essaye de faire des trucs génériques que tu n'aies pas à changer si tu modifies l'écoulement du temps sur ton module. Utilises la fonction HoursToSeconds, elle est là pour ça.

imaginons que tu veuilles compter le nombre de secondes avant une heure précise IG.
D'abord, il faut récupérer l'heure du module. Et convertir GetTimeMinute et GetTimeSeconds en heures IG.

NWScript :

float fHeureIG;
int nHeure = GetTimeHour();
int nSeconds = GetTimeSecond();
int nMinute = GetTimeMinute();

fHeureIG = nHeure + (nMinute*60+nSeconds) / HoursToSeconds(1)
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.


avec ça, tu as une valeur float de l'heure comprises entre nHeure et nHeure+1.

Maintenant, si tu veux déterminer le nombre de secondes (IRL) entre cette heure et une heire du jeu.

NWScript :

float fHeurePrevue = 18.0; //(par exemple 18heures)
float fHeureActuelle = fHeureIG
float fNbSeconds = 0.0;

if (fHeureActuelle > fHeurePrevue) fNbSeconds = ((24.0-fHeureActuelle)+fHeurePrevue)*HoursToSeconds(1); // la faut faire le tour de l'horloge
else fNbSeconds = (fHeurePrevue-fHeureActuelle)*HoursToSeconds(1);
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.


et le tour est joué (je crois)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 29/01/2006 10:25:39 Sujet du message :

En effet, ton idée paraît beaucoup plus appropriée, je vais corriger mon script, merci de l'aide Wink !
J'aurais du regarder la fonction HoursToSecond Laughing !

EDIT:
Citation :
fHeureIG = nHeure + (nMinute*60+nSeconds) / HoursToSeconds(1)
J'avoue ne pas avoir bien compris ce que tu voulais faire içi.
En partant de ce que je sais: HoursToSecond(1) donne 120 par défaut. nMinute*60 donne des secondes de jeu. Disons, que tu as précisément 1 heure et (30*60)+(30) secondes, c'est à dire qu'il est 1:30:30 InGame. Tu divises les secondes par 120: 1830/120, ton float égale donc 15.25. Auquel tu ajoutes nHeure, soit 1. fHeureIG égale donc 16.25, ce qui ne correspond pas du tout à la valeur que tu attends.
Pour convertir un temps IG en des secondes IRL, voir ma fonction. Le HoursToSeconds requiert un entier pour le nombre d'heures, ce qui ne vous permet pas de prendre en compte les minutes, secondes et millisecondes.

J'ai trouvé un script beaucoup plus simple pour l'ouverture/fermeture de la porte. Comme tu le dis, il suffit d'un trigger placé devant la porte Laughing (post contenant le script édité) ! Comment faire compliqué pour peu Embarassed ...
 
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 : 29/01/2006 13:12:05 Sujet du message :

Nan ! Les GetTimeMinute et GetTimeSecond donnent pas des valeurs de l'heure IG, mais le temps écoulé depuis le dernier changement d'heure (voir un de mes posts plus haut).

Donc si il est 15 heures (dans le jeu) et qu'il est 15 heures depuis mettons 1 minute et 30 seconde (IRL).

Si une heure de jeu dure 2 minutes :
HoursToSeconds(1) = 120
GetTimeHour = 15
GetTimeMinute = 1
GetTimeSecond = 30 ===> La fonction renvoie 15 + (1*60+30)/120 = 15.75 donc c'est ok

Si une heure durait 5 minutes, HoursToSeconds = 300, la fonction donne 15+90/300 = 15.3.

Et ensuite si tu veux mesurer le temps en secondes IRL avant 16 heures avec la fonction que j'ai mise fNbSeconds = (fHeurePrevue-fHeureActuelle)*HoursToSeconds(1); on a
cas 1 : 16-15.75 * 120 = .25*120 = 30 secondes
cas 2 : 16 - 15.3 * 300 = .7 * 300 = 210 = 3 minutes 30 secondes

dans les 2 cas le résultat correspond bien à ce qu'on attend
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 2 sur 2 ¤ Aller à la page Précédente  1, 2


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 27.766ms