[Objet] Bâton de MD tri-fonctions

Répondre
Partager Rechercher
J'en avais marre de ne pas avoir à disposition les possibilités de base d'un jeu et aussi de devoir recourir à des scripts made in US.
J'ai donc créé un grand bâton pour MD, de sorte qu'il soit facile à retrouver dans l'inventaire.
Il offre trois fonctions:
- Détruire un plaçable utilisable ou un PNJ (personnage non joueur)
- Relancer le module
- Booter un joueur


ATTENTION: il ne détruit pas les objets statiques !


Plutôt que de faire un .erf, je propose ici les scripts le faisant fonctionner, le dialogue attaché et les caractéristiques de l'objet. Ainsi, ça peut servir en même temps de tutoriel pour créer des objets spéciaux.



1) L'objet lui-même


Dans la palette, créer un bâton. Lui attribuer la propriété "Lancer un sort/ pouvoir unique (ne pas choisir celui qui dit: sur soi, uniquement). Donnez lui l'aspect que vous voulez mais attribuez lui le TAG suivant: "AZ_BATON_MD" (pour être sûr qu'il n'aura pas le tag d'un autre objet. Je ne pense pas qu'il y ait d'objet dont le Tag commence par AZ_ )




2) Le script OnActivateItem() qui va gérer l'utilisation de l'objet


Ouvrez votre script OnActivateItem, que vous trouverez dans "Propriétés du module/ Evènements". S'il n'y en a pas, appuyez sur "Editer" et copiez tel quel ce script sans vous soucier d'autre chose.

Sinon, suivez les commentaires dans le script ci-dessous

Code PHP:

void main()
{


    
// LIMITE D'INSERTION HAUTE

    
object oItem GetItemActivated(); // Object activé
    // vous en avez surement deja un si vous avez un script
    // dans votre OnActivateItem. essayez de le trouver et vous pouvez supprimer
    // cette ligne en remplacant entre les deux LIMITES D'INSERTION (CTRL-R dans l'editeur)
    // oItem par le nom de variable du vôtre. oItem est très courant. Si le vôtre s'appelle
    // ainsi, ne touchez à rien. Supprimez simplement la ligne ci dessus qui est inutile
    // Vous pouvez aussi la laisser.


    // La partie ci-dessous est indispensable au fonctionnement et
    // il vaut mieux ne pas y toucher
   // Sauf pour remplacer le nom de variable oItem au cas où vous en auriez besoin

    
if (GetTag(oItem) == "AZ_BATON_MD"// object oItem = GetItemActivated();
    
{
        
object oPC GetItemActivator();  // Personnage utilisant l'objet
        
object oTarget GetItemActivatedTarget(); // Cible qu'a choisie par l'utilisateur
        
string sTag GetTag(oItem); // Le tag de l'objet utilise


        // if (!GetIsDM(oPC) return; // securite anti-PJ
        // Si vous souhaitez ne laisser utiliser cet objet que par des MD
        // Supprimez les deux "//" devant la ligne commençant par "if" ci-dessus

        
SetLocalObject(oPC"a_detruire"GetItemActivatedTarget());
        
SetLocalObject(oPC"a_booter"GetItemActivatedTarget());
        
// Execution de la commande par le dialogue "dl_az_baton_md"
        
AssignCommand(oPCActionStartConversation(oPC"az_dial_bt_md"TRUEFALSE));
    }
    
// LIMITE D'INSERTION BASSE
}

// NOTE: - si vous avez déjà un script sur OnActivateItem -
// N'insérez que ce qui est compris entre les deux LIMITES D'INSERTION 

Si vous n'aviez pas de script, sauvegardez en lui donnant un nom significatif, limité à 16 caractères comme "on_activate_item". Sinon, ne changez rien.




3) Les scripts qui vont faire le boulot à notre place


Ouvrez l'éditeur de scripts et copiez tels quels ces trois scripts chacun dans une nouvelle fenêtre d'édition. Sauvegardez les scripts sous le nom que vous voulez.
Un nom est suggéré dans le script

Première possibilité: Détruire un objet plaçable non statique:

Code PHP:

//::///////////////////////////////////////////////
//:: FileName az_bt_md_choix_1
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 10/09/2003 17:31:17
//:://////////////////////////////////////////////
// Destruction de l'objet ou du personnage visé

void main()
{
    
object oPC GetPCSpeaker();
    
object oObjet =  GetLocalObject(oPC"a_detruire");

    if (
GetIsPC(oObjet) || GetIsDM(oObjet))
    {
        
SendMessageToPC(oPC"Impossible de détruire un joueur ou un MD");
        return;
    }

   
DestroyObject(oObjet0.0);
   
DeleteLocalObject(oPC"a_detruire");


Deuxième possibilité: Relancer le module

Code PHP:

//::///////////////////////////////////////////////
//:: FileName az_bt_md_choix_2
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 10/09/2003 17:31:41
//:://////////////////////////////////////////////
// Relancer le module
// NOTE: nom du fichier et nom du module (dans Propriétés du module) sont identiques

void main()
{
    
StartNewModule(GetName(GetModule()));

Troisième et dernière possibilité: éjecter un joueur du jeu

Code PHP:

//::///////////////////////////////////////////////
//:: FileName az_bt_md_choix_3
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 10/09/2003 17:32:03
//:://////////////////////////////////////////////
// Virer un joueur du serveur provisoirement. Il pourra se reconnecter tout de suite.
// Mais ça calme un peu

void main()
{
    
object oPC GetPCSpeaker();
    
object oObjet =  GetLocalObject(oPC"a_detruire");

    if (!
GetIsPC(oObjet))
    {
        
SendMessageToPC(oPC"Action impossible, ceci n'est pas un joueur !");
        return;
    }

    if (
oObjet == oPC)
    {
        
SendMessageToPC(oPC"Action impossible, vous ne pouvez vous booter vous-même");
        return;
    }

    
BootPC(oObjet);
    
DeleteLocalObject(oPC"a_booter");

Maintenant que les scripts sont en place, il suffit de les faire fonctionner en utilisant un dialogue que nous allons créer.




4) Créer un dialogue.


Ouvrez l'éditeur de dialogue.

Ajouter (en faisant un click droit sur "racine"):
Que souhaitez vous faire ?
Attention, il n'y a pas de confirmation. tout est fait sur le champ.
<StartCheck>(Si vous n'êtes pas MD, remettez ce bâton à un membre de l'équipe. Si vous êtes pris avec, c'est l'exclusion définitive du serveur pour vous)</Start>

Ajouter:
- Retirer du jeu l'objet plaçable ou le PNJ visé

Sélectionnez l'onglet "Actions Conséquentes" en bas à droite et insérez-y le premier script qui retire les plaçables. Vous pouvez dérouler la liste ou taper directement le nom en entier dans la case réservée à cet effet.


Ajouter:
- Recharger le module

Faites pareil que ci-dessus et insérez le script relançant le module


Ajouter:
- Ejecter un joueur du jeu (le booter)

Faites une dernière fois la manipulation décrite au-dessus et insérez le script qui éjecte un joueur.

Sauvegardez votre dialogue sous :
az_dial_bt_md
Conservez ce nom ou le système ne fonctionnera pas.


Et voilà, vous pouvez maintenant essayer votre nouveau bâton de MD dans le jeu.
Merci par contre je crois savoir que dans le cas d'un module avec hakpak la fonction StartNewModule ne prendra pas en compte la présence du hakpak lors du reboot du module.

Cela était vrai en 1.29, je ne sais pas si cela a été corrigé depuis.
Citation :
je crois savoir que dans le cas d'un module avec hakpak la fonction StartNewModule ne prendra pas en compte la présence du hakpak lors du reboot du module.
Si ,moi ça marchait très bien ...
oui moi! en fait j'avais vu sur NWsources de Asuké un baton qui permettais de modifier les pnj en pinguoins ou vache, ... mais son baton ne fonctionnais que sous SoU (que je n'ai pas encore *aïe! pas frapper*) ainsi que de les figer, et modifier l'alignement.

donc voila , si c'etais possible de faire cela?

je mets le lien pour ceux que ca intéresse http://shinseiki.consolemul.com/nws/...ad.php?tid=204
Est il possible de faire un baton de MD qui stoque dans la Base de Donnée les objets du joueur, sa location, son nom de joueur et de personnage ?

La location, j'ai déjà vu un systeme similaire, ca permettrais par exemple de créer une borne de retour partout où on veut au moment de mourir.
Pour les objets...euh Azmathiel je crois que t'as compris que si y'avait un baton comme ça qui existait je serais bien bien content Ca arrangerais bien mes affaires concernant le lootable corpse


Plus serieusement je pense qu'un baton d'interface avec la base de donnée pourrait être sympa pour sauver des choses lors d'une anim de MDJ. Ainsi le lendemins ou même apres un reboot, le MDJ peut reprendre son anim avec ces joueurs là où ils l'avaient arretés.

Enfin bon bref c'etait juste une idée qui me venait comme ça, peut être que ça sert pas beaucoup non plus .
Bâton MD MULTI-FONCTIONS
Pour la base de donnée, désolé de te décevoir, Damonya, mais il y a autant de façons de faire qu'il y aura de serveurs pour sauvegarder les données. Donc, c'est trop pointu pour faire un truc généraliste.
Par contre, pour les fonctions de base demandées par Xelone, le bâton est prêt. Je fais comme au dessus ou je prépare un erf que je ne saurai pas où héberger ?
J'ai même rajouté une bricole personnelle, sûrement pas très utile, mais marrante. C'est le post d'Etienne qui m'en a donné l'idée: "Monter et descendre des plaçables utilisables dans l'espace".

Donc, pour résumer:

- Détruit un plaçable utilisable
- reboot du module
- boote un joueur
- monte ou descend un plaçable utilisable de 1 ou 5 mètres en hauteur (je ne gère pas le contenu, attention)
- Rajoute ou soustrait 1 point d'alignement Chaotique/Loyal
- Rajoute ou soustrait 1 point d'alignement Mauvais/Bon
- transforme un PJ en pingouin pendant 10 minutes
- idem, en vache pendant 10 minutes
- le paralyse pendant 10 minutes
euh j'ai mis ce fichier sur mon site lycos mais quand je clic dessus (pour tester le lien) il m'affiche la page de mon site et ne me transfere pas vers le fichier a telecharger!! qq'un sait exactement ce que je dois faire ou où le mettre sur mon site?
Voilà les scripts attenants à ce bâton de MD sont postés suite à la demande de Xelone. Pour fixer les variables, il faudra créer un dialogue sur le modèle expliqué au dessus. Chaque script est lancé dans une action conséquente du dialogue. Les variables locales sont sauvegardées sur le MD pendant le OnActivateItem() (voir ci-dessus).


1) Monter / Descendre un plaçable (sans gérer le contenu)
Code PHP:


void main
()
{
    
object oPC GetPCSpeaker();
    
object oObjet GetLocalObject(oPC"objetMD");
    
location lCreate GetLocalLocation(oPC"position_objet");
    
vector vCreate GetPositionFromLocation(lCreate);
    
string sResRef GetLocalString(oPC"resref_objet");
    
float fMonter IntToFloat(GetLocalInt(oPC"monter"));
    
float fAngle GetLocalFloat(oPC"angle_c");
    
vCreate.vCreate.z+fMonter;
    if (
vCreate.0.0vCreate.0.0;
    
vCreate VectorvCreate.xvCreate.yvCreate.z);
    
lCreate Location(GetArea(oPC), vCreatefAngle);
    
CreateObject(OBJECT_TYPE_PLACEABLEsResReflCreateFALSE);
    
DestroyObject(oObjet0.0);


2) Gestion des alignements plus ou moins 1 point dans n'importe quel sens (requiert 4 phrases de dialogue)

Code PHP:


//::///////////////////////////////////////////////
//:: FileName az_alignevil1
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 12/09/2003 22:24:27
//:://////////////////////////////////////////////
void main()
{
    
AdjustAlignment(GetLocalObject(GetPCSpeaker(), "objetMD"), ALIGNMENT_EVIL1);
}



//::///////////////////////////////////////////////
//:: FileName az_aligngood1
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 12/09/2003 22:27:38
//:://////////////////////////////////////////////
void main()
{
    
AdjustAlignment(GetLocalObject(GetPCSpeaker(), "objetMD"), ALIGNMENT_GOOD1);
}


//::///////////////////////////////////////////////
//:: FileName az_alignloyal1
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 12/09/2003 22:28:40
//:://////////////////////////////////////////////
void main()
{
    
AdjustAlignment(GetLocalObject(GetPCSpeaker(), "objetMD"), ALIGNMENT_LAWFUL1);
}



//::///////////////////////////////////////////////
//:: FileName az_alignchaotic1
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 12/09/2003 22:30:18
//:://////////////////////////////////////////////
void main()
{
    
AdjustAlignment(GetLocalObject(GetPCSpeaker(), "objetMD"), ALIGNMENT_CHAOTIC1);


3) Transformer en pingouin pendant 10 minutes:

Code PHP:

//::///////////////////////////////////////////////
//:: FileName az_trpj_pingouin
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 12/09/2003 23:16:02
//:://////////////////////////////////////////////
void main()
{

    
object oPC GetLocalObject(GetPCSpeaker(), "objetMD");
    
effect ePoly EffectPolymorph(26); // Pingouin
    
ApplyEffectToObjectDURATION_TYPE_TEMPORARYePolyoPC600.0);

4) en vache pendant 10 minutes:

Code PHP:


//::///////////////////////////////////////////////
//:: FileName az_trpj_vache
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 12/09/2003 23:29:52
//:://////////////////////////////////////////////
void main()
{

    
object oPC GetLocalObject(GetPCSpeaker(), "objetMD");
    
effect ePoly EffectPolymorph(27); // Vache
    
ApplyEffectToObjectDURATION_TYPE_TEMPORARYePolyoPC600.0);

5) Paralyser pendant 10 minutes la cible:

Code PHP:

//::///////////////////////////////////////////////
//:: FileName az_paralyze_pj
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Azmathiel
//:: Created On: 12/09/2003 23:16:02
//:://////////////////////////////////////////////
void main()
{

    
object oPC GetLocalObject(GetPCSpeaker(), "objetMD");
    
effect ePara EffectParalyze();
    
ApplyEffectToObjectDURATION_TYPE_TEMPORARYeParaoPC600.0);


Attention, les annulations par les PJ des polymorphs ne sont pas gérés, ni le repos. Si le besoin s'en fait sentir, les polymorphs peuvent devenir des SupernaturalEffect() et normalement ne seront plus annulables.
Merci de me le proposer Euronism. Merci à Gaeriel pour son hébergement actuel. Vous trouverez donc tous les fichiers scripts de ce tutoriel/utilitaire dans un .ERF compressé en format .RAR ici. (5,5 Ko)
C'est très intéressant tout ça. J'aurais une petite question, Azmathiel.

Lorsque tu définies l'effet de polymorphie, tu associes un nombre.
Après un ou deux essais rapides : -12 c'est le golem de fer
- 1 c'est le rat-garou
Ma question est donc, comment savoir quelle apparence de créature correspond à quel nombre, existe-t-il une liste ou un tableau ?
Mieux encore qu'une liste ou un tableau : des constantes déjà toutes faites avec des noms clairs.

Quand tu es dans l'éditeur de scripts, clique sur le bouton Constantes à droite, et tape dans la zone Filtre "poly" (sans les guillemets). Et tu vois apparaître toute une liste de constantes. Double-clique sur celle qui t'intéresse pour qu'elle apparaisse à l'endroit du curseur dans ton code. Ainsi pour ton rat-garou, au lieu d'écrire
Code PHP:

ePoly EffectPolymorph(-1); // Prions que -1 corresponde toujours à l'avenir au rat-garou. 

tu écris
Code PHP:

ePoly EffectPolymorph(POLYMORPH_TYPE_WERERAT); 

et tu n'as plus jamais à t'empêtrer dans des listes.

Le Lexicon qui est à peu près à jour, recense toutes les fonctions et toutes les constantes d'Aurora. Avec en prime des infos intéressantes sur leurs éventuels bugs. La page du Lexicon sur les constantes POLYMORPH_TYPE_* : http://www.nwnlexicon.com/compiled/c...orph_type.html.

Ya des constantes pour presque tout (je dis "presque" parce que j'en mettrais pas ma main au feu, mais j'ai toujours trouvé celles que je cherchais), donc le filtre à droite est ton ami .
Citation :
Serait-il possible d'avoir la possibilité de connaître le montant de "Pièces d'Or" que possède un PJ sur lui ?
Depuis la 1.67 c'est possible via l'interface du jeu (Examiner le PJ).
Répondre

Connectés sur ce fil

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