[TUTO] Créer une quête

Voir le sujet précédent Voir le sujet suivant Aller en bas

[TUTO] Créer une quête

Message par Giuliani le Mer 25 Juin - 22:36

COMMENT SCRIPTER AVEC RCCE?

_ Lancez Scriptorama
_ Se référer aux commandes de script
_ Sauvegardez vos script au format .rsl (le format .rcscript est l'ancien, il ne sert plus à rien, vous pouvez les supprimer).
_ Placez vos scripts dans \Data\Server Data\Scripts

_ Pour tester vos scripts sans perdre de temps => Lancez le serveur de RCS, débloquez updates et déconnectez-vous.
Ensuite ouvrez Data\Logs\ et cherchez les erreurs dans SERVER LOGS.TXT, le log vous indiquera le type d’erreur et la ligne. ex:PARSE ERROR est une erreur d'orthographe ou oubli de symbole
_ S'il n'y a aucune erreur signalée dans le log, relancez le serveur et testez en jeu

Choses à faire pour que ce script fonctionne:
1. Créer un script vierge ou vous collerez le script qui suit et placez-le dans \Data\Server Data\Scripts
2. Utilisez l'emitter appellé HealthSpell
3. Vérifiez l'ID de texture (GUE, onglet Média en bas) de la particule pour CreateEmitter
4. Créez une habilité, et assignez ceci en tant que script.
Néo22 avait rédigé un tuto rapide sur les quêtes à l'époque.

Il y a d'abord 2-3 choses basiques à connaitre en script :

1) Les variables :
Premièrement, on commence par les variables, il faut leur définir un type (comme en C).
RC utilise trois type de variable :
les nombres entiers : INT
les nombres à virgule : FLOAT
Les chaines de caractères : CHAR

Dans RealmCrafter ces types de variables sont représentés de cette façon :

ArgentPris% = 8  ==>  le sigle % représente le type INT

Position# = 8.654  ==>  le sigle # représente le type FLOAT

NomDuJoueur$ = "NEO22"  ==>  le sigle $ représente le type CHAR


2) La syntaxe de base :
Comme dans toute programmation, nous allons retrouver la fonction MAIN, c'est la fonction principale à l'intérieur de laquelle nous lancerons les commandes.
elle est rédigée de cette manière :
function Main()
(en C on utiliserait des crochets pour délimiter le début et la fin de la fonction) ici il suffit d'utiliser :
End Function


3) Schéma de la quête :
a) Parler au personnage
b) Tuer 10 ennemies pour lui
c) Gain d'expérience

a) La discussion :
Dialog = OpenDialog(Actor(), ContextActor(), "les rats nous envahissent")
DialogOutput(Actor(), Dialog, "les rat ont envahis la maison au sud ouest de cette position, allez en tuer 6 puis revenez me voir!", 255, 128, 0)
Question% = DialogInput(Actor(), Dialog, "Accepter!, Refuser!")
If (Question% = 1)
;on fait quelque chose
Else
; on dit au revoir
CloseDialog(Actor(), Dialog)
EndIf
Dans le détail :
On crée Dialog= et on définit
Opendialog(Actor(), ContextActor(), Title, [Background]) : on ouvre une fenêtre de dialogue entre deux personnes, ici Actor() est notre personnage et Contextactor() sa cible, Title pour donner un nom à la fenêtre à mettre entre guillemets, et Background est optionnel, il permet de définir un fond d'écran différent pour chaque fenêtre de dialogue en précisant l'ID de la texture souhaitée.

DialogOutput(Actor, Dialog, Message, Red, Green, Blue) : à la place de message, vous mettez votre texte toujours entre guillemets, c'est optionnel mais vous pouvez aussi changer la couleur du texte en modifiant les 3 valeurs de couleurs.

DialogInput(Actor, Dialog, "Option1|Option2| ...|Option12","Divider") : Je n'ai paramétré que 2 réponses possibles: accepter ou refuser, le solutions sont séparés pas une virgule. la première solution vaut 1, la seconde vaut 2 etc... Divider si vous souhaitez séparer par une barre (comme dans la commande)

CloseDialog(Actor, Dialog) : cette commande permet de fermer le fenêtre de dialog
Il est important de tout bien comprendre avant de commencer, si cela est assimilé alors c'est parti:


b) L'objectif de la quête :
il existe plusieurs fonctions de quête, en voici la liste :
NewQuest(Actor(), "Nom de la quête", "Texte de la quête", 255, 0, 0)  ==>       Créer une nouvelle quête
QuestStatus(Actor(), "Nom de la quête")                                        ==>      Connaitre le statut actuel de la quête
UpdateQuest(Actor(), "Nom de la quête", "Nouveau statut", 255, 106, 43) ==>  Permet de mettre à jour une quête
CompleteQuest(Actor(), "Nom de la quête")                                      ==>      Permet de terminer une quête (l'afficher en tant que terminée)
QuestComplete(Actor(), "Nom de la quête")                                      ==>      savoir si la quête est terminée ou non

Ceci est la liste des commande de quête les plus utilisées, il en existe d'autres mais je ne m'en sers que très rarement, je vous laisseras les découvrir en temps voulu.

reprenons maintenant notre script de quête, nous allons donc créer une nouvelle quête avec la commande vue plus haut :
NewQuest(Actor(), "La chasse aux rats", "Allez tuer quelques rats et revenez me voir une fois ce travail réaliser !", 255, 0, 0)

intégrons cela à notre script maintenant :

Dialog = OpenDialog(Actor(), ContextActor(), "les rats nous envahissent")
DialogOutput(Actor(), Dialog, "les rat ont envahis la maison au sud ouest de cette position, allez en tuer 6 puis revenez me voir!", 255, 128, 0)
Question% = DialogInput(Actor(), Dialog, "Accepter!, Refuser!")

If (Question% = 1)
;on fait quelque chose
NewQuest(Actor(), "La chasse au rats", "Allez tuer 10 rats et revenez me voir une fois ce travail réaliser !", 255, 0, 0)
CloseDialog(Actor(), Dialog)
;on attend que la quête soit terminée

Else
; on dit au revoir
CloseDialog(Actor(), Dialog)
EndIf
Voilà vous savez maintenant créer une quête avec un petit dialogue, c'est déjà pas mal, mais pas suffisant, et oui il va falloir terminer la quête maintenant, sinon c'est rédhibitoire comme tutoriel  .


Il existe plusieurs commandes pour les quêtes qui sont des commandes "d'attente".
On va attendre que l'action demandée soit réalisée, voici les quatre existantes :

WaitKill(Actor(), 8, 5)                   ==>  Attendre que le joueur ait tué 5 Actors ID 8
WaitItem(Actor(), "Fourrure", 10)  ==>  Attendre que le joueur ait recolté 10 Fourrures
WaitSpeak(Actor(),                      ==>  Attendre que le joueur ait parlé à l'Actor ID 8
WaitTime(6, 10)                            ==>  Attendre qu'il soit 6h et 10 minutes



dans notre cas on utilise donc dans notre cas :
WaitKill(Actor(), ID, 10)

ID sera une variable provenant de cette fonction :
ID = ActorID("rats", "vermine")

et voilà on a une petite quête mais elle ne se termine pas, pour la terminer il suffit d'ajouter :
CompleteQuest(Actor(), "Nom de la quête")

c) Et on récompense le joueur:
GiveXp(Actor(), 150)                       ==>  On donne 150 points d'expérience au joueur
ChangeGold(Actor(), 30)                  ==>  On modifie son montant d'or
Output(Actor(), "Vous avez terminer la quête, vous gagnez 150 points d'expérience et 30 pièces d'or")     ==>  et on lui notifie les gains

et voilà un script de quête qui fonctionne :

Using "RC_Core.rcm"
function Main()

Dialog = OpenDialog(Actor(), ContextActor(), "les rats nous envahissent")
DialogOutput(Actor(), Dialog, "les rat ce sont emparées de la maison au sud ouest de cette position, allez en tuer 6 puis revenez me voir!", 255, 128, 0)
Question% = DialogInput(Actor(), Dialog, "Acepter!, Refuser!")
If (Question% = 1)
;on fait quelque chose
NewQuest(Actor(), "La chasse au rats", "Alez tuer 10 rats !", 255, 0, 0)
CloseDialog(Actor(), Dialog)
ID = ActorID("rats", "vermine")
WaitKill(Actor(), ID, 10)
CompleteQuest(Actor(), "La chasse au rats")
; ajout d'expérience + or
GiveXp(Actor(), 150)
ChangeGold(Actor(), 30)
Output(Actor(), "Vous avez terminer la quête, vous gagnez 150 points d'expérience et 30 pièces d'or")
Else
; on dit aurevoir
CloseDialog(Actor(), Dialog)
EndIf
End function
Idées d'amélioration :
Ici on peut réaliser la quête plusieurs fois, il serait de bien de vérifier si la quête à déjà était réalisée auparavant.

_ Dans notre script si le joueur se déconnecte le script tombe à l'eau et il est obligé de relancer la quête on peut donc ajouter la fonction Persistent(1) de manière a ce que le script reste actif même hors connexion, par contre si le serveur redémarre ces informations sont perdues.

_ On peut créer des dialogues plus élaborés, ajouter des effets de particules, de flash.

_ Le script de quête peut être nettement plus élaboré on peut mettre a jour la quête à chaque créature tuée, demander de retourner voir le donneur de quête une fois la quête terminée ou donner des objets, etc...

_ Le Top du Top est de créer un système de quête avec une base de donnée. vous pouvez générer vos quêtes en temps réel a partir d'une interface web et vous n'avez qu'un seul script de quête, c'est le système que j'avais mis en place avec MYSQL, ce système ne fonctionne malheureusement plus, il faudrait que je re-code tout en BVM en vue l'arrivée du C# avec RC PRO, je ne vais pas m'y attarder.

Conclusion :
Vous l'aurez compris le script ouvre une multitude de porte, tout est possible et tout est imaginable, suffit d'adopter une certaine logique et une certaine rigueur.
si quelque chose ne fonctionne pas ou si une question vous viens à l'esprit n'hésitez pas à me contacter.

Bon courage à tous

PS:Voila une petite mise à jours de tout ça.
Retravailler, tout tient en un script, à vous de jouer :


Using "RC_Core.rcm"
function Main()

  Player = Actor()
  PlayerName$ = Name(Player)
  Target = ContextActor()
  TargetName$ = Name(Target)
  Persistent(1)
  QuestName$ = "la fin des rats"
  QuestResults$ = QuestStatus(Actor(), QuestName)
  QuestReturn$ = "revenez voir " + TargetName + " pour terminer la quete!"
  DoEvents(500)

RewardMoney% = 8
  RewardXp% = 60
  RewardItem = ""
  RewardItemQuantity% = 1
  RewardFaction = ""
  RewardFactionValue = 0

  QuestStatusText$ = "tuez 6 rats proches de la maison au sud ouest!"
  D = OpenDialog(Player, Target, "les rats nous envahisent")
  DialogOutput(Player, D, "Bonjour" + PlayerName + "", 255, 255, 255)

  If (QuestResults$ = "")

     DialogOutput(Actor(), D, "les rat ce sonts emparees de la maison au sud ouest de cette position, alez en tuer 6 pui revenez me voir!", 255, 128, 0)
     Result = DialogInput(Actor(), D, "Acepter!, Refuser!")
     If (Result = 1)


        NewQuest(Actor(), QuestName, QuestStatusText$, 255, 0, 0)
        QuestTemp$ = QuestName + ": " + QuestStatusText
        Output(Actor(), QuestTemp, 255, 255, 255)
        CloseDialog(Actor(), D)
        number% = 6
        n% = number% -1
        i% = 0
        While(n% >= i%)
        WaitKill(Actor(), 8, 1)
        i% = i% + 1
        UpdateQuest(Actor(), QuestName, "Rat tue : [ "+ i + " / "+ number +" ]", 255, 106, 43)
        Output(Player, "Rat tue : [ "+ i + " / "+ number +" ]", 255, 106, 43)
        WEnd
        UpdateQuest(Player, QuestName, QuestReturn, 0, 255, 0)
        QuestTemp$ = QuestName + ": " + QuestReturn
        Output(Player, QuestTemp, 0, 255, 0)

     Else

        CloseDialog(Player, D)

     EndIf
  ElseIf (QuestResults = QuestReturn)

     DialogOutput(Player, D, "Vous avez terminer la quete : " + QuestName$ + "" + CHR(44) + " Bon travail!", 255, 255, 255)
     DialogResult% = DialogInput(Player, D, "Aurevoir!")

     CompleteQuest(Player, QuestName$)
     GiveItem(Player, RewardItem, RewardItemQuantity)
     GiveXp(Player, RewardXp%)
     ChangeGold(Player, RewardMoney%)
     ChangeFactionRating(Player, RewardFaction, RewardFactionValue)
     Output(Player, "Vous recevez " + RewardMoney% + "Po et " + RewardXp% + "xp!")
     CloseDialog(Player, D)

  ElseIf (QuestComplete(Player, QuestName) = 1)

     DialogOutput(Player, D, "merci d" + CHR(39) + "avoir realiser la quete " + QuestName + "" + CHR(44) + " pour moi!", 255, 255, 255)
     DoEvents (1000)

     CloseDialog(Player, D)
  Else

     DialogOutput(Player, D, "Vous n" + CHR(39) + "avez pas encore terminer la quete : " + QuestName$ + "!", 255, 255, 255)
     DialogResult% = DialogInput(Player, D, "Aurevoir"); See changes to DialogInput command.

     CloseDialog(Player, D)

  EndIf

  Return

End Function
cordialement neo

 

Lancez RC et allez sur la map, placez-y un PNJ (waypoint avec un actor) et dans l'option "on right-click Script", choisissez le script créé dans RCScript.
Sauvegardez et testez le fonctionnement en jeu.

Enjoy
avatar
Giuliani
Admin

Messages : 210
Points : 349
Date d'inscription : 25/06/2014
Age : 38
Localisation : Toulouse

http://realmcrafter.frbb.net

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum