excuter un script en boucle ????
Moderator: Modérateurs pour les forum Français
-
paladin3333
- Posts: 80
- Joined: Wed, 1. Mar 06, 18:28

excuter un script en boucle ????
j'aimerai créer un ajout de generateur de bouclier. Mon code pour redonner de l'energie marche.
Cependant il ne marche qu'a la réinitialisation de l'editeur (1 seul fois).
Comment on fait pour excuter un script en boucle?
J'ai essayé les while mais ça ne marche toujours qu'a la reinitialisation du script. (1 seule fois)
si j'attribu une touche à nom script, ca marche.
je souhaite donc que le faite d'avoir un object dans le cargot on est une regeneration de 1% d'energie pour les boucliers sans qu'on est à appuyer sur une touche.
Cependant il ne marche qu'a la réinitialisation de l'editeur (1 seul fois).
Comment on fait pour excuter un script en boucle?
J'ai essayé les while mais ça ne marche toujours qu'a la reinitialisation du script. (1 seule fois)
si j'attribu une touche à nom script, ca marche.
je souhaite donc que le faite d'avoir un object dans le cargot on est une regeneration de 1% d'energie pour les boucliers sans qu'on est à appuyer sur une touche.
-
PrizzZ
- Posts: 2352
- Joined: Sun, 28. Mar 04, 15:56

-
paladin3333
- Posts: 80
- Joined: Wed, 1. Mar 06, 18:28

Alors voici mon code:
001 load text: id=8832
002
003 $OGBID = get global variable: name='OGB.KeyID'
004 if $ID < 0 OR $ID == null
005 $NewOGBID = register hotkey 'OGB ' to call script 'plugin.ogb.transfert'
006 set global variable: name='OGB.KeyID' value=$NewOGBID
007 end
008
009
010 if [PLAYERSHIP] -> get true amount of ware Optimisateur de generateur de bouclier in cargo bay
011 $CurrentMaxShield = [PLAYERSHIP] -> get maximum shield strength
012 $CurrentShield = [PLAYERSHIP] -> get current shield strength
013 if $CurrentShield < $CurrentMaxShield
014 @ START [THIS] -> call script 'plugin.ogb.activated' : ***script qui ajoute l'energie
015 end
016 end
017
018
019 @ = [THIS] -> call script 'lib.paladin.addware' : Station Type=Dock d'Equipement Argon Race of station=Argon Product To Add=Optimisateur de generateur de bouclier Break Out Point=100
020
021 return null
donc tout marche, sauf ma boucle. Elle ne marche qu'une fois au moment de l'initialisation.
j'ai essayé de basculer les conditions dans le script 'plugin.ogb.activated' avant d'appliquer l'energie, ça me fait le meme effet.
qu'est ce qu'il me manque?

001 load text: id=8832
002
003 $OGBID = get global variable: name='OGB.KeyID'
004 if $ID < 0 OR $ID == null
005 $NewOGBID = register hotkey 'OGB ' to call script 'plugin.ogb.transfert'
006 set global variable: name='OGB.KeyID' value=$NewOGBID
007 end
008
009
010 if [PLAYERSHIP] -> get true amount of ware Optimisateur de generateur de bouclier in cargo bay
011 $CurrentMaxShield = [PLAYERSHIP] -> get maximum shield strength
012 $CurrentShield = [PLAYERSHIP] -> get current shield strength
013 if $CurrentShield < $CurrentMaxShield
014 @ START [THIS] -> call script 'plugin.ogb.activated' : ***script qui ajoute l'energie
015 end
016 end
017
018
019 @ = [THIS] -> call script 'lib.paladin.addware' : Station Type=Dock d'Equipement Argon Race of station=Argon Product To Add=Optimisateur de generateur de bouclier Break Out Point=100
020
021 return null
donc tout marche, sauf ma boucle. Elle ne marche qu'une fois au moment de l'initialisation.
j'ai essayé de basculer les conditions dans le script 'plugin.ogb.activated' avant d'appliquer l'energie, ça me fait le meme effet.
qu'est ce qu'il me manque?
-
paladin3333
- Posts: 80
- Joined: Wed, 1. Mar 06, 18:28

-
paladin3333
- Posts: 80
- Joined: Wed, 1. Mar 06, 18:28

-
paladin3333
- Posts: 80
- Joined: Wed, 1. Mar 06, 18:28

001 load text: id=8832
002
003 * Attribution d'une touche pour transfert d'energie lazer vers bouclier
004 $OGBID1 = get global variable: name='OBG1.KeyID'
005 if $OGBID1 < 0 OR $OGBID1 == null
006 $NewOGB1 = register hotkey 'OGB energy to shield' to call script 'plugin.ogb.toshield'
007 set global variable: name='OBG1.KeyID' value=$NewOGB1
008 end
009
010 * Attribution d'une touche pour transfert d'energie bouclier vers lazer
011 $OGBID2 = get global variable: name='OBG2.KeyID'
012 if $OGBID2 < 0 OR $OGBID2 == null
013 $NewOGB2 = register hotkey 'OGB energy to lazer' to call script 'plugin.ogb.tolazer'
014 set global variable: name='OBG2.KeyID' value=$NewOGB2
015 end
016
017 while [TRUE]
018 $CurrentMaxShield = [PLAYERSHIP] -> get maximum shield strength
019 $CurrentShield = [PLAYERSHIP] -> get current shield strength
020 if $CurrentShield < $CurrentMaxShield
021 [PLAYERSHIP] -> set current shield strength to 10000
022 end
023 end
024
025 * Ajout d'OBG au dock argon
026 @ = [THIS] -> call script 'lib.paladin.addware' : Station Type=Dock d'Equipement Argon Race of station=Argon Product To Add=Optimisateur de generateur de bouclier Break Out Point=100
027
028
029 return null
Bon obligé de tous me retaper c'est genial
ce script m'a planté la machine et je ne peux meme pas modifier mon script de l'exterieur pour enlever cette foutu boucle!!!
y a 2 choses que je ne sais pas faire.
Faire ajouter de l'energie en continue tant que l'object est dans le cargos, et dans un premier tant ajouter de l'energie au bouclier en permanence.
Ensuite, modifier l'energie pour les lazers???!??? y a pas de set strenght pour les lazer!!!!
ou c'est une autre option....
j'y perd mon latin help
002
003 * Attribution d'une touche pour transfert d'energie lazer vers bouclier
004 $OGBID1 = get global variable: name='OBG1.KeyID'
005 if $OGBID1 < 0 OR $OGBID1 == null
006 $NewOGB1 = register hotkey 'OGB energy to shield' to call script 'plugin.ogb.toshield'
007 set global variable: name='OBG1.KeyID' value=$NewOGB1
008 end
009
010 * Attribution d'une touche pour transfert d'energie bouclier vers lazer
011 $OGBID2 = get global variable: name='OBG2.KeyID'
012 if $OGBID2 < 0 OR $OGBID2 == null
013 $NewOGB2 = register hotkey 'OGB energy to lazer' to call script 'plugin.ogb.tolazer'
014 set global variable: name='OBG2.KeyID' value=$NewOGB2
015 end
016
017 while [TRUE]
018 $CurrentMaxShield = [PLAYERSHIP] -> get maximum shield strength
019 $CurrentShield = [PLAYERSHIP] -> get current shield strength
020 if $CurrentShield < $CurrentMaxShield
021 [PLAYERSHIP] -> set current shield strength to 10000
022 end
023 end
024
025 * Ajout d'OBG au dock argon
026 @ = [THIS] -> call script 'lib.paladin.addware' : Station Type=Dock d'Equipement Argon Race of station=Argon Product To Add=Optimisateur de generateur de bouclier Break Out Point=100
027
028
029 return null
Bon obligé de tous me retaper c'est genial
y a 2 choses que je ne sais pas faire.
Faire ajouter de l'energie en continue tant que l'object est dans le cargos, et dans un premier tant ajouter de l'energie au bouclier en permanence.
Ensuite, modifier l'energie pour les lazers???!??? y a pas de set strenght pour les lazer!!!!
ou c'est une autre option....
j'y perd mon latin help
-
Serial Kicked
- Posts: 3823
- Joined: Fri, 12. Aug 05, 20:46

Moué moué moué.
Bon je vais sembler un poil brutal, mais visiblement tu essaye de faire des choses bien compliquées à grand coups de copier coller sans vraiment savoir les bases, et ça donne des soucis comme ceux tu as depuis le début.
Donc:
1/ La partie qui sert à changer le bouclier n'a rien à faire dans le setup. Certes, bien codé, ça peut marcher, mais ce n'est pas vraiment du code convenable. La méthode la plus propre serait de rajouter une commande au vaisseau (voir mes tuto) pour activer / désactiver ton optimisateur de generateur de bouclier. En plus ça aurait l'avantage d'être executable sur n'importe quel navire du joueur et pas seulement sur le [playership]
2/ Comme de bien entendu, dans ta boucle "while" tu n'as pas mis d'instruction "wait", les instructions tourne en boucle sans jamais laisser la main au joueur ou aux autres scripts -> boom plantage.
Ca ne plantera plus, mais je doute fortement que ça fasse ce que tu veux. Comme je lis la chose, c'est un script de God Mode.
Ca vérifie en boucle l'energie du bouclier du joueur. Si le bouclier est inferieur au maximum, alors on remet sa valeur à 10000. Il n'y a pas de vérification de la présence de l'objet nécessaire dans le vaisseau. Par ailleurs je ne sais pas d'ou sort cette valeur de 10000, mais à mon avis ça ne conviendra pas à tous les types de vaisseaux, loin de là (d'autant plus si 10000<MaxShield).
Pour les lasers, je ne crois pas qu'ils aient inclu une commande pour celà. J'avoue ne pas avoir vraiment vérifié, mais je ne suis jamais tombé dessus en parcourant les menus.
Bon je vais sembler un poil brutal, mais visiblement tu essaye de faire des choses bien compliquées à grand coups de copier coller sans vraiment savoir les bases, et ça donne des soucis comme ceux tu as depuis le début.
Donc:
1/ La partie qui sert à changer le bouclier n'a rien à faire dans le setup. Certes, bien codé, ça peut marcher, mais ce n'est pas vraiment du code convenable. La méthode la plus propre serait de rajouter une commande au vaisseau (voir mes tuto) pour activer / désactiver ton optimisateur de generateur de bouclier. En plus ça aurait l'avantage d'être executable sur n'importe quel navire du joueur et pas seulement sur le [playership]
2/ Comme de bien entendu, dans ta boucle "while" tu n'as pas mis d'instruction "wait", les instructions tourne en boucle sans jamais laisser la main au joueur ou aux autres scripts -> boom plantage.
En corrigé ça donne:moi, dans un autre topic wrote:{ Note: si vous ètes un absolu débutant en script, vous devez savoir impérativement ceci : à partir du moment ou vous faites une boucle ("while" par exemple) vous devez inclure une commande wait dans cette boucle. En effet le "multitache" de X3 marche en mode coopératif. C'est à dire que chaque script qui tourne pendant un moment doit faire des pauses pour laisser l'occasion aux autres de s'exécuter. Plus vos wait sont courts et plus ils ralentiront globalement X3 }
Code: Select all
while [TRUE]
$CurrentMaxShield = [PLAYERSHIP] -> get maximum shield strength
$CurrentShield = [PLAYERSHIP] -> get current shield strength
if $CurrentShield < $CurrentMaxShield
[PLAYERSHIP] -> set current shield strength to 10000
end
wait(1000)
endCa vérifie en boucle l'energie du bouclier du joueur. Si le bouclier est inferieur au maximum, alors on remet sa valeur à 10000. Il n'y a pas de vérification de la présence de l'objet nécessaire dans le vaisseau. Par ailleurs je ne sais pas d'ou sort cette valeur de 10000, mais à mon avis ça ne conviendra pas à tous les types de vaisseaux, loin de là (d'autant plus si 10000<MaxShield).
Pour les lasers, je ne crois pas qu'ils aient inclu une commande pour celà. J'avoue ne pas avoir vraiment vérifié, mais je ne suis jamais tombé dessus en parcourant les menus.
X3:TC/AP Pirate Guild 3 - Yaki Armada 2 - Anarkis Defense System
Anarkis Gaming HQ
Independent Game Development
X3 Scripting and Modding Station
Anarkis Gaming HQ
Independent Game Development
X3 Scripting and Modding Station
-
Azz
- Posts: 1031
- Joined: Tue, 18. May 04, 20:14

Le script que tu nous liste est un script de setup (qui se lance au démarrage) ?
On ne doit pas mettre de boucle infinie dans un script de setup
Les scripts de setup sont éxécutés l'un après l'autre, le suivant attendant que le précédent soit terminé pour pouvoir démarrer.
Donc si boucle dans scripts setup, l'initialisation ne se terminera jamais et c'est le plantage assuré. En règle général les scripts de setup doivent être le plus court possible, et doivent plutôt lancer en annexe (commande style START script...) les tâches qui s'éffectueront en tâche de fond, sans bloquer les autres setup
Dans ton cas, extrait ta boucle dans un petit script indépendant, et fait le lancer par ton script de setup (START 'script_de_boucle)
Et surtout rajoute une pause dans ta boucle (wait 500 par ex) pour qu'elle ne monopolise pas tout le temps machine, sinon replantage assuré...
Bon courage
Edit : Grillé par SK
On ne doit pas mettre de boucle infinie dans un script de setup
Les scripts de setup sont éxécutés l'un après l'autre, le suivant attendant que le précédent soit terminé pour pouvoir démarrer.
Donc si boucle dans scripts setup, l'initialisation ne se terminera jamais et c'est le plantage assuré. En règle général les scripts de setup doivent être le plus court possible, et doivent plutôt lancer en annexe (commande style START script...) les tâches qui s'éffectueront en tâche de fond, sans bloquer les autres setup
Dans ton cas, extrait ta boucle dans un petit script indépendant, et fait le lancer par ton script de setup (START 'script_de_boucle)
Et surtout rajoute une pause dans ta boucle (wait 500 par ex) pour qu'elle ne monopolise pas tout le temps machine, sinon replantage assuré...
Bon courage
Edit : Grillé par SK
-
paladin3333
- Posts: 80
- Joined: Wed, 1. Mar 06, 18:28

-
paladin3333
- Posts: 80
- Joined: Wed, 1. Mar 06, 18:28

Bien mon OGB fonctionne correctement maintenant grace à vous.
Il n'y a plus que le transfert d'energie à faire dans ce cas là...
Si il n'y a pas de solution pour un lazer -> shield et shield -> lazer, je vais opter pour une charge par photopile.
sinon voici mon code final.
setup.plugin.ogb.xml
001 load text: id=8832
002
003 * Energie lazer to shield
004 $OGB1ID = get global variable: name='OGB1.KeyID'
005 if $OGB1ID < 0 OR $OGB1ID == null
006 $NewOGB1ID = register hotkey 'OGB Energy to shield' to call script 'plugin.ogb.toshield'
007 set global variable: name='OGB1.KeyID' value=$NewOGB1ID
008 end
009
010 * Energie shield to lazer
011 $OGB2ID = get global variable: name='OGB2.KeyID'
012 if $OGB2ID < 0 OR $OGB2ID == null
013 $NewOBG2ID = register hotkey 'OBG Energy to lazer' to call script 'plugin.ogb.tolazer'
014 set global variable: name='OBG2.KeyID' value=$NewOBG2ID
015 end
016
017 * rechargement d'energie de 1%
018 @ START [THIS] -> call script 'plugin.ogb.reload' :
019
020
021 @ = [THIS] -> call script 'lib.paladin.addware' : Station Type=Dock d'Equipement Argon Race of station=Argon Product To Add=Optimisateur de generateur de bouclier Break Out Point=100
022
023 return null
plugin.ogb.reload.xml
001 $CurrentShield = [PLAYERSHIP] -> get current shield strength
002 $CurrentMaxshield = [PLAYERSHIP] -> get maximum shield strength
003
004 while [TRUE]
005
006 skip if not [PLAYERSHIP] -> get true amount of ware Optimisateur de generateur de bouclier in cargo bay
007 $CurrentShield = [PLAYERSHIP] -> get current shield strength
008
009 $Energie = ( $CurrentMaxshield / 100 ) + $CurrentShield
010 if $CurrentShield < $CurrentMaxshield
011 [PLAYERSHIP] -> set current shield strength to $Energie
012 end
013
014 @ = wait 1000 ms
015 end
016
017 return null
J'ai remarqué qu'apres chaques modifications de boucle j'ai du recharger une partie, car les precedents restent en memoire.
il y a une commande break pour casser une boucle non? mais si on la casse on ne peut plus redémarrer...
Sinon j'ai un soucis, vu comme mon code est fait, lorsque j'ouvre la soute, l'energie reste a zero et ma boucle de rechargement s'active.
Il n'y a plus que le transfert d'energie à faire dans ce cas là...
Si il n'y a pas de solution pour un lazer -> shield et shield -> lazer, je vais opter pour une charge par photopile.
sinon voici mon code final.
setup.plugin.ogb.xml
001 load text: id=8832
002
003 * Energie lazer to shield
004 $OGB1ID = get global variable: name='OGB1.KeyID'
005 if $OGB1ID < 0 OR $OGB1ID == null
006 $NewOGB1ID = register hotkey 'OGB Energy to shield' to call script 'plugin.ogb.toshield'
007 set global variable: name='OGB1.KeyID' value=$NewOGB1ID
008 end
009
010 * Energie shield to lazer
011 $OGB2ID = get global variable: name='OGB2.KeyID'
012 if $OGB2ID < 0 OR $OGB2ID == null
013 $NewOBG2ID = register hotkey 'OBG Energy to lazer' to call script 'plugin.ogb.tolazer'
014 set global variable: name='OBG2.KeyID' value=$NewOBG2ID
015 end
016
017 * rechargement d'energie de 1%
018 @ START [THIS] -> call script 'plugin.ogb.reload' :
019
020
021 @ = [THIS] -> call script 'lib.paladin.addware' : Station Type=Dock d'Equipement Argon Race of station=Argon Product To Add=Optimisateur de generateur de bouclier Break Out Point=100
022
023 return null
plugin.ogb.reload.xml
001 $CurrentShield = [PLAYERSHIP] -> get current shield strength
002 $CurrentMaxshield = [PLAYERSHIP] -> get maximum shield strength
003
004 while [TRUE]
005
006 skip if not [PLAYERSHIP] -> get true amount of ware Optimisateur de generateur de bouclier in cargo bay
007 $CurrentShield = [PLAYERSHIP] -> get current shield strength
008
009 $Energie = ( $CurrentMaxshield / 100 ) + $CurrentShield
010 if $CurrentShield < $CurrentMaxshield
011 [PLAYERSHIP] -> set current shield strength to $Energie
012 end
013
014 @ = wait 1000 ms
015 end
016
017 return null
J'ai remarqué qu'apres chaques modifications de boucle j'ai du recharger une partie, car les precedents restent en memoire.
il y a une commande break pour casser une boucle non? mais si on la casse on ne peut plus redémarrer...
Sinon j'ai un soucis, vu comme mon code est fait, lorsque j'ouvre la soute, l'energie reste a zero et ma boucle de rechargement s'active.
