Aujourd'hui je m'en remet à la communauté skript pour m'aider sur l'un de mes projet, le skript Random Zone.
Voici mon problème : Je cherche à ajouter un moyen simple de modifier le nombre de blocs de chaque type devant apparaître, sous forme de pourcentage. Par exemple, la commande /rz apply 70%stone,20%coal ore, 10%iron ore doit signifier "on rempli 70% de la zone avec de la stone, 20% avec du minerai de charbon, et 10% avec du minerai de fer". Et en fait mon problème ne se situe pas là. La commande est déjà prête, les pourcentages sont pris en compte, mais voici 4 résultats sur un carré de 10*10 avec cette commande:
Vous voyez bien le soucis, les bloc ayant un petit pourcentage apparraîssent tout en bas, ratatinés.
Voici le code concerné (si vous voulez le reste allez voir sur le post de la ressource):
loop {_randfloor.blocks::*}:
if "%loop-value%" does not contain "%%": # si on a pas de pourcentage dans cet élément
message "{@logo} &4Erreur : &cVeuillez spécifier un pourcentage pour tout les blocs, ou bien ne spécifiez &naucun&c pourcentage"
message "{@logo} &cproblème : ""%loop-value%"" "
stop trigger
add "%loop-value%" to {_blocks::*} # on add la valeur à une liste
set {_verifPourc} to 0 # déclaration en dehors de la loop (vaut pour toutes les instructions de ce type
loop {_blocks::*}:
set {_temp::*} to loop-value split by "%%" # on casse les info en 2, pour avoir d'un coté le pourcentage, de l'autre le bloc
if {_temp::1} parsed as number is smaller than 1: # autrement dit 0 ou moins
message "{@logo}&4 Erreur&c : Vous ne pouvez pas mettre de pourcentage négatif ou nul:"
message "{@logo}&c %{_temp::1}%%%%{_temp::2}%"
stop trigger
add "%{_temp::1}%|%{_temp::2}%" to {_blocks1::*} # Cette instruction n'est pas obligatoire, mais elle permet de me rappeler qu'on a finis une étape
add {_temp::1} parsed as number to {_verifPourc} # au passage on ajoute tout les pourcentages
if {_verifPourc} is smaller than 100: # pour vérifier que le total est bien de 100
message "{@logo}&4 Erreur&c : Vous n'avez indiqué que %{_verifPourc}%%% des blocs devant être posés !"
message "{@logo}&c Ce n'est pas assez -> revoyez vos pourcentages"
stop trigger
if {_verifPourc} is greater than 100:
message "{@logo}&4 Erreur&c : Vous avez indiqué %{_verifPourc}%%% de blocs deant être posés !"
message "{@logo}&c C'est trop -> revoyez vos pourcentages"
stop trigger
set {_placeP} to 0
set {_blocks2::*} to "" and ""
loop {_blocks1::*}:
add 1 to {_placeP}
# message "%loop-value%"
set {_temp::*} to loop-value split by "|"
set {_nbBlPos} to {_tailleZone} / 100 * {_temp::1} parsed as number # on transforme le pourcentage en nombre de blocs avec ce calcul
# message "%{_nbBlPos}% blocs de %{_temp::2}%"
set {_blocks2::%{_placeP}%} to "%{_nbBlPos}%|%{_temp::2}%"# et on re compresse les valeurs
loop blocks within {_loc1} to {_loc2}: # début de la partie qui ne marche pas bien
set {_blockNum} to random integer between {_nbBlock}-({_nbBlock}-1) and {_nbBlock} # random number between 1 and {_nbBlock} # C'est ce choix de nombre qui fait que les blocs sont "écrasés" en bas du carré (j'explique plus bas)
set {_temp::*} to {_blocks2::%{_blockNum}%} split by "|" # on sépare -> en ::1 le nb de blocs, en ::2 le bloc
while {_temp::1} parsed as number is 0: #si le nb de bloc est tombé à zéro (on a "utilisé" tout es bloc dispo
set {_blockNum} to random integer between {_nbBlock}-({_nbBlock}-1) and {_nbBlock} # random number between 1 and {_nbBlock} # alors on en choisi un autre
set {_temp::*} to {_blocks2::%{_blockNum}%} split by "|"
set {_temp::1} to {_temp::1} parsed as number - 1 # pour indiquer qu'on en a bien posé 1
set {_blocks2::%{_blockNum}%} to "%{_temp::1}%|%{_temp::2}%" # on update la variable
set block at location of loop-block to "%{_temp::2}%" parsed as item # et on pose le bloc
Voici les explication (de là ou j'ai mis que j'expliquai plus bas): en gros quelque soit le nombre de bloc de chaque type, le code va :
- compter combien il y a de type de bloc,
- attribuer à chacun de ces blocs un nombre, qui correspond à leur pourcentage d'apparition
- un fois ceci fait, lance une boucle qui fait défiler tous les blocs de la zone,
- pour chaque loop-block, il choisis un type de bloc aléatoire, et le pose si son nombre d'apparition n'est pas nul.
Le soucis c'est que le choix de ce bloc aléatoire n'est pas pondéré selon le nombre d'apparition : c'est donc logique que les blocs ayant une faible apparition apparraîssent en bas du carré.
Ma question est donc, avez vous une idée de comment régler ce soucis, et faire apparaître régulièrement tout les blocs ??
Et merci d'avance à ceux qui ont eu le courage de lire mon pavé, et encore plus merci à ceux qui m'aideront :)
Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.
Question
blueblasterz
Bonjour/Bonsoir à tous.
Aujourd'hui je m'en remet à la communauté skript pour m'aider sur l'un de mes projet, le skript Random Zone.
Voici mon problème : Je cherche à ajouter un moyen simple de modifier le nombre de blocs de chaque type devant apparaître, sous forme de pourcentage. Par exemple, la commande /rz apply 70%stone,20%coal ore, 10%iron ore doit signifier "on rempli 70% de la zone avec de la stone, 20% avec du minerai de charbon, et 10% avec du minerai de fer". Et en fait mon problème ne se situe pas là. La commande est déjà prête, les pourcentages sont pris en compte, mais voici 4 résultats sur un carré de 10*10 avec cette commande:
[ATTACH=full]3192[/ATTACH] [ATTACH=full]3193[/ATTACH] [ATTACH=full]3194[/ATTACH] [ATTACH=full]3195[/ATTACH]
Vous voyez bien le soucis, les bloc ayant un petit pourcentage apparraîssent tout en bas, ratatinés.
Voici le code concerné (si vous voulez le reste allez voir sur le post de la ressource):
Voici les explication (de là ou j'ai mis que j'expliquai plus bas): en gros quelque soit le nombre de bloc de chaque type, le code va :
- compter combien il y a de type de bloc,
- attribuer à chacun de ces blocs un nombre, qui correspond à leur pourcentage d'apparition
- un fois ceci fait, lance une boucle qui fait défiler tous les blocs de la zone,
- pour chaque loop-block, il choisis un type de bloc aléatoire, et le pose si son nombre d'apparition n'est pas nul.
Le soucis c'est que le choix de ce bloc aléatoire n'est pas pondéré selon le nombre d'apparition : c'est donc logique que les blocs ayant une faible apparition apparraîssent en bas du carré.
Ma question est donc, avez vous une idée de comment régler ce soucis, et faire apparaître régulièrement tout les blocs ??
Et merci d'avance à ceux qui ont eu le courage de lire mon pavé, et encore plus merci à ceux qui m'aideront :)
7 réponses à cette question
Messages recommandés