Script craft

Répondre
Partager Rechercher
Bonjour!

je suis une débutant en thermes de script. Et je voulais savoir si il serrai possible d'avoir un peu d'aide. Je ne demande pas à ce que l'on fasse mon travaille à ma place. Mais que l'on me guide. Car même en aillant lue entièrement les différents Tutorial. Je n'arrive pas à faire de scripte viable.

Je voudrais faire un système complet de craft. Pour le moment je vais donc commencer simple. C'est à dire dès que tu clique sur un placable on te donne un objet.

A l'heure actuel j'ai ça. Donc à mettre dans le OnUsed du placable.
Citation :
#include "ginc_debug"
{
object oPC = GetLastUsedBy();
if ( GetIsObjectValid(oPC) == FALSE )
{
oPC = OBJECT_SELF;
}

// default stack size
if ( nQuantity < 1 )
{
nQuantity = 1;
}
object CreateItemOnObject
(
string sItemTemplate,
object oTarget = OBJECT_SELF;
int nStackSize = 1;
string sNewTag = "tag_objet";
)
CreateItemsOnObject( sTemplate, oPC, nQuantity );
}
Sinon j'avais penser à ça. Mais je ne sais pas ce qui est mieux.
Citation :
void main()
#include "ginc_debug"
{
object oUser = GetLastUsedBy();
object oItem = ActionGiveItem();
object oGiveTo = oPlayer();
int bDisplayFeedback=TRUE();

PrettyDebug( GetName( OBJECT_SELF ) + "'s was used by " + GetName( oUser ) );
}
if (GetIsObjectValid(oUser))
{
oPC = OBJECT_SELF;
}

// default stack size
if ( nQuantity < 1 )
{
nQuantity = 1;
}
CreateItemsOnObject( sTemplate, oPC, nQuantity );
}
object CreateItemOnObject
(
string sItemTemplate,
object oTarget = OBJECT_SELF;
int nStackSize = 1;
string sNewTag = "tag_objet";

)
Ensuite l'idée ça serai d'y ajouter des fonctions au fur et à mesure pour faire quelque chose de complet. C'est à dire que le scripte finale devras donner entre 1 à 5 unité en fonction de ton score de fouille. Par exemple si tu fais 30 (10 en fouille + 20 de ton jet) tu aurai les 5 unités, par contre si tu fait 11 (10 en fouille + 1 de ton jet) tu ne ramasserais qu'1 unité. Il faudrait également inclure une duré empêchant l'utilisation du placable après la récolte genre 1 minute. Et que tu reçoive 5 xp si tu a récolté quelque chose.

Après je ne sais pas si c'est possible, mais j'aimerais bien identifier plusieurs placable grâce à leur tag (un arbre, un arbuste, etc), mais que chaque placable est son propre loot (pomme, oeuf, etc) avec le même système de ramassage. Ca serait pour éviter d'avoir plusieurs foi le même scripte pour les différents objets.
Salutations,

Je vais faire simple, quelqu'un viendra sans doute te donner plus de conseils.

Tout d'abord as-tu essayé de compiler tout ça ? Ça te donnerait une meilleure idée de ce qui peut coincer.

Ensuite pour ton premier script voilà quelques infos :
- Un include se fait habituellement dans les premières lignes de ton script puis il est suivi de la déclaration de fonction (manquante dans le script 1) ;
- Tu n'as pas besoin de recopier la signature d'une fonction pour pouvoir l'utiliser (CreateItemOnObject), la plupart sont disponible par défaut ;
- Toutes les variables que tu utilise doivent être déclarées puis initialisées (ce n'est pas le cas dans ton exemple pour nQuantity et sTemplate).

Si on rassemble tout ça on aurait par exemple :
Code PHP:

void main()
{
  
object oPC GetLastUsedBy();
  if (
GetIsObjectValid(oPC) == FALSE)
  {
    
// oPC = OBJECT_SELF;
    // J'ai remplacé par un return pour quitter
    // Je pense qu'affecter OBJECT_SELF à oPC est une erreur de logique, non ?
    
return;
  }
  
  
// nQuantity n'est déclaré nulle part -> erreur de compilation
  // if (nQuantity < 1)
  // {
  //   nQuantity = 1;
  // }
  
  // Déclaration et assignation de nQuantity
  
int nQuantity 1;
  
  
// Idem pour sTemplate
  
string sTemplate "my_template";
  
  
// Création de l'objet
  
CreateItemOnObject(sTemplateoPCnQuantity);


En complément je t'invite à aller sur nwn2 JOL pour y récupérer la liste des fonctions de nwn2 par défaut ainsi que la liste des constantes :
- [Fonctions]
- [Constantes]

Courage !
Merci beaucoup pour ta réponse

Je me suis donc inspiré de ce que tu as fait et j'ai essayer d'ajouter des conditions de loot.
Code PHP:

int SkillSearch GetIsSkillSuccessful (SKILL_SEARCHoPCnDifficulty);
  
string sTemplate "champignon";
  
CreateItemOnObject(sTemplateoPCnQuantity); 

if (
SkillSearch)
 
int nDifficulty 10;
 
int nQuantity 1;
  
if else (
SkillSearch)
  
int nDifficulty 11;
  
int nQuantity 2
Il me dit que la variable de int pour nDifficulty n'est pas bonne. Ca fonctionne en pourcentage?
Voilà une autre règle à prendre en compte : une variable ne se déclare qu'une fois (mais peut être assignée plusieurs fois).

Tu sembles aussi avoir quelques problèmes avec les conditions if/else if, petit tuto : la condition doit être dans les parenthèses du if :
Code PHP:

if (nQuantity 2
Le code exécuté si la condition est vraie doit être mis après l'ouverture des crochets du if. Si le code en question n'est qu'en une seule ligne tu peux omettre les crochets :
Code PHP:

if (nQuantity 2)
{
  
// Mon code ici
// Fin du if

// OU
if (nQuantity 1)
  
// Mon code en UNE SEULE ligne
// Fin du if 
Dans le cas où il y a plusieurs choix à un if, on utilise la structure if/else if/else :
Code PHP:

if (nQuantity == 1)
{
  
// Premier cas, quantité égale à 1
}
else if (
nQuantity == 2)
{
  
// Deuxième cas, quantité égale à 2
}
else
{
  
// Tous les autre cas !

J'ai commenté ton code :
Code PHP:

// Cette ligne n'est pas bonne : nDifficulty n'est pas encore déclaré.
int SkillSearch GetIsSkillSuccessful (SKILL_SEARCHoPCnDifficulty);
string sTemplate "champignon";

// Cette ligne n'est pas bonne : oPC et nQuantity ne sont pas déclarés.
CreateItemOnObject(sTemplateoPCnQuantity); 

// Si tu ne mets pas de crochets après ton if,
// seule la première ligne est considérée dans le if
if (SkillSearch)
 
int nDifficulty 10// Déclaration invalide !
 
int nQuantity 1// Cette ligne n'est pas dans le if malgré l'indentation

// Problème d'utilisation de la structure if/else if
if else (SkillSearch)
  
int nDifficulty 11// Déclaration invalide.
  
int nQuantity 2// Cette ligne n'est pas dans le if
  // ET on redéclare nQuantity donc ce n'est pas bon ! 
Edit : il existe un site avec beaucoup d'info sur le nwscript qui est ici : [nwn lexicon]. C'est en anglais et pour neverwinter nights 1 mais quasiment tout s'applique. Tu y trouveras des exemples d'utilisation de fonction, ça devrait t'aider.
Voici ce que j'ai fait.
Cela compile et il fonctionne de la manière suivante :
Lorsque tu clique sur un objet, si tu réussit ton jet ça te donne aléatoirement entre 1 à 6 lot de champignon.
Code PHP:

void main()
{
    
object oPC=GetLastUsedBy();
    if (
GetIsObjectValid(oPC) == FALSE)
  { 
    return; 
  } 
 
    if (
GetIsSkillSuccessful(oPCSKILL_SEARCH15))
    {
 
        
int nNum=Random(6);
        
int nQuantity=Random(6);
        
string sNum=IntToString(nNum);
        
string sTemplate "champignon";
        if (
GetStringLength(sNum)==1sNum="00"+sNum;
        else if (
GetStringLength(sNum)==2sNum="0"+sNum;
        
sNum="champignon"+sNum;
        
CreateItemOnObject(sNumoPCd10());
        
CreateItemOnObject(sTemplateoPCnQuantity);
    }

Bon c'est peut être un peu bâtard comme script, mais il marche XD. Il ne manque plus qu'a ajouter l'identification des plaçables par le tag et de mettre un délai de réutilisation.

Dernière modification par Zanaphiela ; 16/05/2014 à 15h51.
Voici donc la suite du scripte
Code PHP:

{
    
object oPC=GetLastUsedBy()
    
object oTarget GetObjectByTag (sTag "nid"nNth 0)
    if (
GetIsObjectValid(oPC) == FALSE)
  { 
    return; 
  } 
 
    if (
GetIsSkillSuccessful(oPCSKILL_SEARCH15))
    {
 
        
int nNum=Random(6);
        
int nQuantity=Random(6);
        
string sNum=IntToString(nNum);
        
string sTemplate "oeuf";
        if (
GetStringLength(sNum)==1sNum="00"+sNum;
        else if (
GetStringLength(sNum)==2sNum="0"+sNum;
        
sNum="oeuf"+sNum;
        
CreateItemOnObject(sNumoPCd10());
        
CreateItemOnObject(sTemplateoPCnQuantity);
        
GiveXPToCreatureoPC10);
DestroyObject (sTag)
        }

Je voudrais qu'il n'y est qu'un seul scripte pour plusieurs Plaçable. J'avais penser à utiliser GetObjectByTag, mais ce n'est pas bon. Il est préférable d'utiliser GetTag(oObject)? Ou c'est juste la ligne de commande qui n'est pas correctement formuler?

Pour ce qui est de rendre le Plaçable inutilisable, j'avais penser à le détruire. Et donc mettre ce scripte dans le OnDeath du placable.
Code PHP:

//definit le temps avant le respawn du placable
const float TEMPS_AVANT_RESPAWN=500.0;

//fonction qui permet de faire respawn un objet
void RespawnMe(string sResReflocation lLocationstring sTag)
{
CreateObject(OBJECT_TYPE_PLACEABLEsResReflLocationFALSEsTag);
}

//fonction principale
void main()
{
//Temps de respown en seconde
float fSeconds TEMPS_AVANT_RESPAWN ;
string sMyResRef GetResRef(OBJECT_SELF);
location lMyLocation GetLocation(OBJECT_SELF);
string sMyTag GetTag(OBJECT_SELF);
AssignCommand(GetArea(OBJECT_SELF), DelayCommand(fSeconds RespawnMe(sMyResReflMyLocationsTag)));

Je reprends ton code, mais je pense que tu aurais plus vite fait d'utiliser le compilateur du toolset pour ce genre de choses.
Code PHP:

object oPC=GetLastUsedBy() // ; manquant
// déclaration de sTag et nNth manquantes
object oTarget GetObjectByTag (sTag "nid"nNth 0// ; manquant

[...]
// DestroyObject prend un object en paramètre, pas un tag ! CF la doc :)
DestroyObject (sTag// ; manquant 
Pour utiliser un script sur plusieurs placeables, il te suffit d'affecter ce script aux placeables en question
Ba justement. De mon coter, j'ai un souci avec le compilateur du toolset. Il me dit juste qu'il y a une erreur dans une ligne, mais ne m'indique pas ce que c'est :s du coup je dois avoué que j'ai un peu de mal à savoir ce qu'il faut que je modifie. Car ça pourrait très bien être les variables, les déclarations, les paramètres, les fonctions, les constantes, etc

Pour ce qui est du plaçable je sais qu'il faut le mettre dans le Onused de chaque plaçable sur le quel je désire qu'il y est un loot. Cependant comme tu as pue le constater j'ai 2 plaçable différents. Le premier s'appelle Champignon et le deuxième Nid. Le truc c'est qu'il n'arrive pas à faire la différence lorsque je clique sur le Nid ou sur le Champignon et me donne les 2 loots aléatoire quelque soi le plaçable sur le quel je clique. Donc pour régler ce problème je suis obliger de passer par le ciblage du plaçable par le Tag.
Voici le scripte complet, cela compile mais ne fonctionne pas. Je pense que c'est dû au 2 validations d'objet. Vous en dite quoi?
Code PHP:

void main()
{
    
object oPC=GetLastUsedBy();
    
string sTag1 "Mushroom01";
    
string sTag2 "nid";
    
int nNth 0;
    
object oTarget1 GetObjectByTag(sTag1nNth);
    
object oTarget2 GetObjectByTag(sTag2nNth);
    if(
GetIsObjectValid(oPC) == FALSE)
       { 
       return; 
       }
    if(
GetIsObjectValid(oTarget1) == FALSE)
    {
        return;
        if (
GetIsSkillSuccessful(oPCSKILL_SEARCH15))
        {
 
        
int nNum=Random(6);
        
int nQuantity=Random(6);
        
string sNum=IntToString(nNum);
        
string sTemplate "champignon";
        if (
GetStringLength(sNum)==1sNum="00"+sNum;
        else if (
GetStringLength(sNum)==2sNum="0"+sNum;
        
sNum="champignon"+sNum;
        
CreateItemOnObject(sNumoPCd10());
        
CreateItemOnObject(sTemplateoPCnQuantity);
        
GiveXPToCreatureoPC10);
        }    
  
    else if(
GetIsObjectValid(oTarget2) == FALSE)
       {
        return;
        if (
GetIsSkillSuccessful(oPCSKILL_SEARCH15))
        {
 
        
int nNum=Random(6);
        
int nQuantity=Random(6);
        
string sNum=IntToString(nNum);
        
string sTemplate1 "oeuf";
        if (
GetStringLength(sNum)==1sNum="00"+sNum;
        else if (
GetStringLength(sNum)==2sNum="0"+sNum;
        
sNum="oeuf"+sNum;
        
CreateItemOnObject(sNumoPCd10());
        
CreateItemOnObject(sTemplate1oPCnQuantity);
        
GiveXPToCreature(oPC10);
        }
      }
 }

J'ai pas trop le temps de commenter ton code là, mais à première vue ton script présente une erreur de logique.

Si je comprends bien, tu voudrais que le script créé soit des oeufs, soit des champignons en fonction du placeable utilisé.

Voilà deux problèmes étrange dans ton code :
Code PHP:

// on entre dans ce if si l'objet est invalide, c'est voulu ça ?
if(GetIsObjectValid(oTarget1) == FALSE)
{
  
// ce return indique qu'on coupe le script, ce n'est pas ce qu'on veut à priori
  
return;
  [...]

Si tu as un return quelque part, note bien que s'il est exécuté il termine la fonction actuelle. En l'occurence chez toi il termine ton main donc tout ce qui est après le return n'est pas exécuté !

Pour faire la distinction entre les deux placeable, une méthode simple est d'utiliser GetTag(object); qui renvoie le tag de l'objet que tu lui donne.
Si tu utilise ton script sur un on_use de placeable, tu peux donc simplement faire quelque chose comme ça:
Code PHP:

void main()
{
  
object placeable OBJECT_SELF// object_self représente l'objet utilisé
  
string tag GetTag(placeable);

  if (
tag == "nid")
  {
    
// code du nid
  
}
  else if (
tag == "champi")
  {
    
// code pour les champignons
  
}

Bref, je te laisse regarder tout ça !
Répondre

Connectés sur ce fil

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