[Script] Soldes sur les coffres à trésor - Vous pourrez les créer dans Aurora

Répondre
Partager Rechercher
Profitez en, pour une fois, il y en aura pour tout le monde. La nouvelle possibilité d'affecter des variables à des objets sous l'éditeur m'a amené à repenser un système de spawns de coffres à trésors le plus simple du monde et je vous le livre. Faites en bon usage. J'espère le retrouver dans de nombreux modules qui enfin pourront offrir de vrais coffres à respawn !
Un système simple, comme je les aime.


Cette version permet pour un contenant, de définir DEUX objets spawnables en quantité aléatoire et une certaine quantité d'or aléatoire.
Par exemple: entre 100 et 200 po, une armure prédéfinie avec 10% de chance qu'elle apparaisse, et entre 2 et 6 potions de soins légers avec une probabilité d'apparition de 50%. De fixer le délai avant le respawn et de régler la vidange du contenant. Et tout ça en deux coups de cuillère à pot !




La petite cerise sur le gâteau

Cette version prend en compte les Dons "Chance des héros" "Chanceux" et le domaine de prêtrise Chance pour améliorer très légèrement les chances des PJs les possédant ou leur donner un petit bonus d'or.



Les avantages

- Simple à mettre en oeuvre, un seul script qu'on peut mettre soit sur le OnOpen d'un contenant, soit sur le OnUsed (si on veut éviter le bug des contenants qui restent bloqués)
- On VISUALISE ce qu'on va spawner dès la mise en place de l'objet préparé ! (pas de mauvaise surprise in-game)
- Customisable pour chaque contenant, directement sous l'éditeur
- On peut préparer ses coffres sous l'éditeur moyennant un tout petit effort. (à la fois un avantage et un inconvénient)
- Vide le contenant après une durée paramétrable pour éviter la surcharge CPU due aux plaçables avec des objets dans l'inventaire


Les inconvénients:

- Il faut rentrer des variables à la main sous l'éditeur (à la fois un avantage et un inconvénient)
- Il reste un laps de temps où il y aura une surcharge CPU paramétrable grâce à une variable.
- Les objets non empilables n'offriront qu'une seule occurrence. (type arme ou armure. Attention, les munitions sont des empilables)


Code PHP:

// Script permettant de faire spawner avec un pourcentage de chances
// un objet dans un contenant quelconque base sur le ResRef
// et la quantite stockees dans des variables locales.
// Ce script tient compte du facteur chance du PJ en
// augmentant ses pourcentages de reussite de +2 pour chaque don
// "chanceux".
// OBJET SPAWNE 1: resref_objet1 (string)
// OBJET SPAWNE 2: resref_objet2 (string)
// pourcentage objet 1: chance_objet2 (int)
// pourcentage objet 2: chance_objet2 (int)
// quantite max objet 1: quantite_objet1 (int) (aleatoire avec cette limite max)
// quantite max objet 2: quantite_objet2 (int) (aleatoire avec cette limite max)
// quantite or minimun : minor (int)
// quantite or maximum : maxor (int)
// chance_objet1
// chance_objet2
// maxor
// minor
// quantite_objet1
// quantite_objet2
// resref_objet1
// resref_objet2


void AzViderContenant(object oContenant);


void AzViderContenant(object oContenant)
{
    
object oItem GetFirstItemInInventory(oContenant);
    while (
GetIsObjectValid(oItem))
    {
        
DestroyObject(oItem0.0);
        
oItem GetNextItemInInventory(oContenant);
    }
}



// A METTRE SUR ONOPEN ou ONUSED du contenant

void main()
{
    
object oContenant OBJECT_SELF;
    
int nRespawn GetLocalInt(oContenant"respawn");   // Ce n'est pas l'heure du respawn
  
if (nRespawn 0) return;
    
object oPC GetLastOpenedBy();  // Le personnage


    
string stob1 GetLocalString(oContenant"resref_objet1"); // RESREF 1er objet
    
string stob2 GetLocalString(oContenant"resref_objet2"); // RESREF 2eme objet

    
int nminor GetLocalInt(oContenant"minor");  // Minimum or
    
int nmaxor GetLocalInt(oContenant"maxor");  // Maximum or

    
if ( (stob1 == ""// si toutes les variables sont nulles
            
&& (stob2 =="")
            && (
nmaxor == 0) )
            return; 
// inutile de traiter ce contenant

    
int npob1 GetLocalInt(oContenant"chance_objet1");
    
int npob2 GetLocalInt(oContenant"chance_objet2");
    
int nqob1 GetLocalInt(oContenant"quantite_objet1");
    
int nqob2 GetLocalInt(oContenant"quantite_objet2");
    
float fTimer IntToFloat(GetLocalInt(oContenant"timer"));    // Temps avant prochain respawn possible
    
float fVider IntToFloat(GetLocalInt(oContenant"vider"));     // Temps avant de vider le contenant

    
int nOr;    // Stockage nombres
    
int nq;     // Servira a creer un nombre aleatoire

    
int nChance Random(100); // Jet d'un D100 100 = reussi, 0 = rate

    // Prise en compte des parametres de chance
    
if (GetHasFeat(FEAT_LUCKY)) nChance nChance 2;
    if (
GetHasFeat(FEAT_LUCK_OF_HEROES)) nChance nChance 2;
    if (
GetHasFeat(FEAT_LUCK_DOMAIN_POWER)) nChance nChance 2;
    
// Si l'un des domains existe, il est impossible de faire 0 sur le de 100
    // Le minimum sera de 2 a 6 selon les dons du personnage
    // Fin des parametres de chance. Commenter ces lignes si inutile

    
if (nmaxor != 0)
    {
        
nOr Random(nmaxor) - nminor;
        
nOr nOr nminor
                
+ (10*(GetHasFeat(FEAT_LUCKY)*GetHitDice(oPC)))    // bonus de 10*niv po si chanceux
                
+ (10*(GetHasFeat(FEAT_LUCK_OF_HEROES)*GetHitDice(oPC)))
                + (
10*(GetHasFeat(FEAT_LUCK_DOMAIN_POWER)*GetHitDice(oPC)));

        
CreateItemOnObject("nw_it_gold001"oContenantnOr);
    }

    if ( (
stob1 != "") && (nChance >= npob1) )
    {
        
nq Random(nqob1);
        if (
nq <= 0nq 1;
        
CreateItemOnObject(stob1oContenantnq);
    }
    if ( (
stob2 != "") && (nChance >= npob2) )
    {
        
nq Random(nqob2);
        if (
nq <= 0nq 1;
        
CreateItemOnObject(stob2oContenantnq);
    }
    
SetLocalInt(oContenant"respawn"1);
    
DelayCommand(fTimerDeleteLocalInt(oContenant"respawn"));
    
DelayCommand(fViderAzViderContenant(oContenant));

Comme vous l'aurez compris après une lecture attentive, il faut créer un contenant dans la palette sur lequel on créera quelques variables. Rien de compliqué, rassurez vous. Mais c'est le prix à payer pour le système le plus flexible et le plus simple au monde pour personnaliser entièrement vos coffres.

Une copie d'écran qui montre les variables:
variables.jpg

Pour modifier une variable, vous cliquez dessus dans la liste, vous modifiez par exemple ici, la resref de l'objet à spawner puis vous cliquez sur Remplacer. Et hop... votre coffre est prêt à spawner la dernière armure incorporée à votre module.

NOTE: les objets non empilables n'auront qu'une instance spawnée, contrairement aux objets empilables, qui pourront être donnés aléatoirement entre 1 et quantite_objet1 ou quantite_objet2.

La variable chance_objetX:
Elle permet de déterminer le pourcentage de chances qu'un objet apparaisse: 0 = TOUJOURS, 100 = JAMAIS

MINOR et MAXOR:
la quantité d'or générée sera tirée aléatoirement entre ces deux bornes. Si vous ne voulez pas mettre d'or, mettez MAXOR à 0.


Si vous ne voulez spawner qu'une seule chose, par exemple l'or, vous videz les RESREF.


La façon la plus efficace de procéder pour utiliser ce système est de créer un objet contenant plaçable, utilisable avec un inventaire dans la palette. De créer les variables dessus puis de le dupliquer en modifiant son aspect.
Une fois placé dans une zone, rien ne vous empêche de modifier les variables qui sont définies dessus par défaut.

le ".ERF" contient deux plaçables et le script. Pour tester, importez le dans un nouveau module vide et essayez.

le ".ERF" est par ici

Si une aide supplémentaire est requise, n'hésitez pas à poster ici. Ainsi que de formuler des critiques sur le tutoriel ci-dessus.

Bon courage


(EDIT: petite erreur, j'ai inversé le JAMAIS et le TOUJOURS des probabilités dans mon explication, je corrige: 0 pour TOUJOURS, puisqu'on fera toujours un jet supérieur à 0 sauf si Random() renvoie 0) et un jet supérieur à 100 ne sera jamais possible sauf si les dons "chance" entrent en jeu. C'est corrigé dans le texte explicatif maintenant)
une utilisation judicieuse des variables locales sous aurora

je pense que cette ajout nous réserve bien d'autres bonne suprise, c'est un petit bijoux !

en tout cas, bien joué !
Très bien pour les coffres qui ont peu de types d'objets à offrir, mais ça devient vite ingérable si tu veux qu'un coffre propose 200 ou 300 objets différents.

Pour ma part, mes informations de respawns de coffres se situent au niveau des tags, comme pour beaucoup de monde je crois :
- 6 qualités de coffres.
- Plusieurs types de coffres : général, armes, armures, pour mages, etc...
- Un timer.
- Pour chaque qualité de coffre est défini dans le tag une chance de drop et un nombre d'objets à dropper dans cette qualité.

Voici un exemple de tag de coffre : cal0020_000000000000012002400460

- c : juste pour dire que c'est un coffre.
- al : type du coffre, armes, armures, all, misc, mages, etc...
- 0020 : il respawn toutes les 20 heures in game.
- 0000 : qualité +4, 0 objet avec 0% de chance de drop chaque.
- 0000 : qualité +3, 0 objet avec 0% de chance de drop chaque.
- 0000 : qualité +2, 0 objet avec 0% de chance de drop chaque.
- 0120 : qualité +1, 1 objet avec 20% de chance de drop chaque.
- 0240 : qualité +0, 2 objets avec 40% de chance de drop chaque.
- 0460 : qualité -1, 4 objets avec 60% de chance de drop chaque.

Il est juste nécessaire de mettre des coffres de références contenant les objets qui peuvent se dropper dans chaque coffre.

L'ennui : je ne peux décemment pas construire des dizaines de types de coffres pour des drops spécifiques. D'où le grand intérêt de ta méthode qui est tout à fait complémentaire .
il y a des cas ou
Ou on se sent hors compétition !

vraiment ma-gni-fique

merci
__________________
Congnois toy toy mesme. Nulle gloire dans le sang inutile
Merci pour ces échos positifs.
Je pense que ce système apportera vraiment un plus aux créateurs qui ne savent pas vraiment scripter en leur facilitant énormément la tâche. Et je vois qu'il complétera des systèmes déjà existants. Tout le monde est gagnant. C'est ce qu'il faut !
bien je ne l'utiliserais probablement pas (j'ai déjà scripté cette partie du module), mais il me donne quelques bonnes idées, utilisables dans bien d'autres contextes
Il est clair que le système de variables locales définies directement sous Aurora est vraiment très puissant.

Tiens, en passant, une idée que j'utilise depuis quelques semaines avec ces variables : Pour interdire la reco. dans une zone, je définis une variable locale dans ma zone, donjon par exemple, "No_reco" de type string qui contient un tag de waypoint, par exemple "Wp_donj_exit".

Si un perso. se reco. dans la zone, j'ai juste à tester si la variable locale existe dans ma zone, si oui, je le téléporte au waypoint correspondant. Vraiment ultra-simple à faire et très pratique.
Je viens de trouver ce script qui me semble pas mal du tout donc je le remonte, ça fera pas de mal et j'en profite pour savoir s'il existe une version + récente par hasard ?

Et comment faire pour qu'on puisse avoir + de 2 items différents dans le coffre ?
Citation :
Publié par LordNemesis
Je viens de trouver ce script qui me semble pas mal du tout donc je le remonte, ça fera pas de mal
Merci

Citation :
Publié par LordNemesis
et j'en profite pour savoir s'il existe une version + récente par hasard ?

Et comment faire pour qu'on puisse avoir + de 2 items différents dans le coffre ?
Pas de version plus récente. Je l'utilise tel quel.

Pour créer plus d'objets, il te faut créer plus de variables et les gérer comme c'est fait pour les deux existantes.
Le système des variables locales sur objets, je l'utilise beaucoup.

Par exemple imposer les horaires où va arriver un PNJ dans la zone (la porte de sa maison s'ouvre, il sort, referme la porte, puis se dirige vers le waypoint qui correspond à son tag), et quand il doit retourner dans sa maison.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés