excuter un script en boucle ????

Tout sur les scripts et les mods pour X², X³, X³TC et X³AP.

Moderator: Modérateurs pour les forum Français

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

excuter un script en boucle ????

Post by paladin3333 »

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.
PrizzZ
Posts: 2352
Joined: Sun, 28. Mar 04, 15:56
x3tc

Post by PrizzZ »

Normalement un script du genre

boucle infinie

-> verifier qu'il y est l'objet dans la soute
si oui
-> redonner de l'energie

end

devrait marcher non ?
Publie ton code, ca nous aidera a mieux cerner le rpblème si tu ne vois pas la solution.
paladin3333
Posts: 80
Joined: Wed, 1. Mar 06, 18:28
x3

Post by paladin3333 »

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?

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

Post by paladin3333 »

au passage, il n'y a pas de commande pour modifier l'energie des lazers :?

j'espere que c'est une plaisanterie de chez egosoft
User avatar
Azz
Posts: 1031
Joined: Tue, 18. May 04, 20:14
x4

Post by Azz »

Où est ce que tu vois une boucle dans ton script ? :?
iou naud ouate, aille ama pis | Pilote IA | Site
paladin3333
Posts: 80
Joined: Wed, 1. Mar 06, 18:28
x3

Post by paladin3333 »

là, y en a pas, mais si j'en mets une entre mon start script ça plante mon pc.

Comment vous feriez une boucle en continue si un object est dans votre inventaire?

Quel est le code pour ajouter de l'energie au laser ?
paladin3333
Posts: 80
Joined: Wed, 1. Mar 06, 18:28
x3

Post by paladin3333 »

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 :evil: 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
User avatar
Serial Kicked
Posts: 3823
Joined: Fri, 12. Aug 05, 20:46
x3tc

Post by Serial Kicked »

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.
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 }
En corrigé ça donne:

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)
end
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.
X3:TC/AP Pirate Guild 3 - Yaki Armada 2 - Anarkis Defense System

Anarkis Gaming HQ
Independent Game Development
X3 Scripting and Modding Station
User avatar
Azz
Posts: 1031
Joined: Tue, 18. May 04, 20:14
x4

Post by Azz »

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 :D
iou naud ouate, aille ama pis | Pilote IA | Site
paladin3333
Posts: 80
Joined: Wed, 1. Mar 06, 18:28
x3

Post by paladin3333 »

merci pour vos infos precieuses!

oui c'est du god mod pour le moment, c'est juste un test serial pour essayer de faire cette boucle 8) .

Sinon vous n'avez pas d'info concernant l'energie des lazers???

je n'ai trouvé qu'un GET mais pas de SET :cry:
paladin3333
Posts: 80
Joined: Wed, 1. Mar 06, 18:28
x3

Post by paladin3333 »

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.

Return to “Script et Modding pour la Trilogie X”