Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Quelques questions pas trop compliquées

Par Simkim le 12/10/2002 à 18:23:28 (#2323629)

1) Jai donné à un marchand une quantité limité des biens quil pouvait vendre. Je voudrais quil refasse son stock régulièrement. Par exemple, je voudrais quil ne vende que 10 potions de soins par semaine. Au premier jour de la semaine suivante, il a de nouveau 10 potions en stocks.
Est-ce quil est possible davoir un script qui fasse ça et qui se mette dans le OnOpenStore ?

2) Jai envie de créer un service de messagerie instantanée. Un PJ doit parler à un PNJ et lui dire à qui il veut envoyer un message. Il faudrait quun script recherche les PJ présent sur le module et ceux qui ni sont pas à ce moment là mais qui y sont inscrit (en gros ceux qui ont une sauvegarde) pour vérifier si le nom donné correspond à un PJ. Le PJ doit pouvoir taper un message qui est mit automatiquement sur parchemin. Ensuite, ce message doit être délivré par un autre PNJ aux destinataire, immédiatement si le PJ est sur le module ou alors à la prochaine apparition du PJ sur le module.
Je sais pas si je suis bien clair. Je sais que les joueurs nont quà senvoyer des mails, ce sera plus simple, mais moi je trouve ça drôle (et en plus il y a plein dutilisations possibles). Je demande pas le script en entier (mais je ne le refuse pas), jaimerais surtout les lignes de commande (cest comme ça quon dit ?) dont jaurais besoin avec une petite explication pour les utiliser.

3) Je voudrais quun groupe de PNJ se téléporte auprès dun PJ. En fait il me faudrait un truc du style mercenaire du Poing Enflammé qui arrivaient par centaines quand on commettait un crime dans BG1.

Merci d'avance :merci:

Par Caillou PierreSang le 12/10/2002 à 19:11:45 (#2323869)

Je sais que ça va pas t'aider... mais

Quelques questions pas trop compliquées
c'est un doux euphémisme !:mdr:

Excuse-moi, mais ce que tu demandes, j'suis pas capable d'en faire 1/10e !!! :eek: :eek: :eek:

Par Simkim le 12/10/2002 à 19:24:18 (#2323943)

Si ça peut te rassurer, je ne dois pas être capable de faire 1/10e des 1/10e que tu sais faire. :mdr:

Par Jedaï le 13/10/2002 à 0:21:03 (#2325599)

Ouh là, ouh là, des questions "pas trop compliquées"....:monstre:

A part la question 3 qui est relativement basique, tes 2 premières questions exige un scripting relativement avancé !

1) Alors là je ne suis pas sûr des limites de delaycommand() mais je te propose comme même ce script sur le OnOpenStore :


void main()
{
object o = OBJECT_SELF;

DelayCommand(120.0, ExecuteScript("regarnir_mag", o));
}


On va raisonnablement penser qu'au bout de deux minutes(120 s) le joueur aura fini ses achats. On créera donc un second script au nom de "regarnir_mag" qu'on compilera à part sans le mettre nulle part :



void VoidCIOO(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1)
{
CreateItemOnObject(sItemTemplate, oTarget, nStackSize);
}

void main()
{
object o = OBJECT_SELF;

SetLocalInt(o, "nRegarnir", 1);

int nNb = 10- GetNumStackedItems(GetItemPossessedBy(o,"NW_IT_MPOTION020"));
SetLocalInt(o, "nNb", nNb);
if (nNb && !GetLocalInt(o, "nRegarnir"))
{
SetLocalInt(o, "nRegarnir", 1);
DelayCommand(HoursToSeconds(168), VoidCIOO("it_mpotion021", o, GetLocalInt(o, "nNb")));
DelayCommand(HoursToSeconds(168), SetLocalInt(o, "nRegarnir", 0));
}
}


Je pense que ceci marchera, ce n'est pas exactement ce que tu voulais faire et il y a sans doute mieux mais bon....
Les tags et blueprints sont ceux d'une potion de soin modérée, à toi de voir.
Ce script ne se déclenchera qu'à partir du moment où un joueur utilisera le magasin, une semaine après ce premier achat il recréera les potions et il recommencera à décompter le temps à partir du prochain achat de joueur.

Autre possibilité, meilleure, à mettre sur le OnOpenStore :


void main()
{
object o = OBJECT_SELF;

if (!GetLocalInt(o, "nRegarnir"))
{
SetLocalInt(o, "nRegarnir", 1);
int nDay = GetCalendarDay()+7;
int nMonth = GetCalendarMonth();
if (nDay > 30)
{
nDay = nDay-30;
nMonth = nMonth+1;
if (nMonth > 12)
nMonth = 1;
}
SetLocalInt(o, "nDay", nDay);
SetLocalInt(o, "nMonth", nMonth);
}

if (GetLocalInt(o, "nDay") <= GetCalendarDay()
&& GetLocalInt(o, "nMonth") 30)
{
nDay = nDay-30;
nMonth = nMonth+1;
if (nMonth > 12)
nMonth = 1;
}
SetLocalInt(o, "nDay", nDay);
SetLocalInt(o, "nMonth", nMonth);
}
}


Je te conseille plutôt la deuxième même si elle présente le risque de se trouver surchargé si tu as un monde désert.(ce qui n'est pas le cas de la première) Elle respecte mieux l'idée : livraison toutes les semaines.

2)Je sais pas, j'ai quelques idées mais elles aboutissent toutes à des chaines préparés à l'avance ce qui restreint de beaucoup l'intérèt...

3)Assez simple mais je pourrai avoir la condition de déclenchement ?
Sinon la boucle principale devrait ressembler à ça :


object oJump = "le premier à transporter";
while (GetIsObjectValid(oJump))
{
AssignCommand(oJump, JumpToObject( "l'endroit où on veut les envoyer : un waypoint...");
oJump = "l'objet suivant";
}


Par exemple :
si tout tes persos ont le même tag :

object oJump = GetObjectByTag("leTagDesTransportés");
int n = 0;
while (GetIsObjectValid(oJump))
{
AssignCommand(oJump, JumpToObject( GetWaypointByTag("WP_DESTINATION")));
n++;
oJump = GetObjectByTag("leTagDesTransportés", n);
}

Par Simkim le 13/10/2002 à 10:46:07 (#2326580)

1 Je vais tester la deuxième solution. Par contre je vais avoir un script immense parce que le marchand il vend plein dobjet. Ce qui aurait été bien cest un script qui enregistre les quantité de chaque objet puis les remette automatiquement au bout dun certain temps sans être obligé de lui dire quil y a 5 épées, 10 potions, etc.
En fait un truc du style : enregistre le stock de départ pour chaque objet, remet le stock au bout de 1 semaine. Si de telles commandes existaient, le script ne prendrait que quelques lignes.

2 Ce qui me pose problème cest surtout un moyen de vérifier si les PJ sont dans le module ou sils y ont une sauvegarde. Pour le reste, javais trouvé des scripts qui pourraient être utilisé (si jai bien compris leur utilité) mais en bidouillant un peu.

3 La condition de déclenchement !? Tu nas donc pas joué à BG 1 ? Installe BG 1 et fait une partie, et à Brasamical tape sur des pauvres paysans innocent, tu comprendras ce que je voulais dire.
Je vais un peu mieux expliquer si tu nas pas BG 1. Lorsque tu commettais un crime, un groupe de mercenaires apparaissait pour te tuer. Le problème cest que des groupes apparaissaient continuellement jusquà ce que mort sen suive. A des moment, tes personnages se retrouvaient entourés de plus dune dizaine de PNJ. Cest un peu cette situation que je voudrais recréer : commettre est possible mais faut surtout pas se faire repérer.

Merci :merci:

Par Jedaï le 13/10/2002 à 14:04:04 (#2327540)

Bon...
:rasta:
Après moult réflexion voici l'état final de mes recherches en ce qui concerne la question 1, normalement ces scripts devrait faire exactement ce que tu as dit, c'est à dire :
_ Initialise le stock au début de la partie,
_ Remet chaque semaine le stock dans son état initial.

Tous ces scripts sont à mettre sur le marchand, après tout s'il est mort ce n'est plus la peine de mettre le stock à jour....

OnSpawn :


//::///////////////////////////////////////////////
//:: Custom On Spawn In
//:: File Name onsp_marchand
//:: Copyright (c) 2002 Bioware Corp.
//:://////////////////////////////////////////////
/*spawn pour marchand qui enregistre les objets present dans son stock au debut
du jeu pour simuler un reapprovisionnement
*/
//:://////////////////////////////////////////////
//:: Created By: Jedai
//:://////////////////////////////////////////////
#include "NW_O2_CONINCLUDE"
#include "NW_I0_GENERIC"
void main()
{
SetListeningPatterns();
WalkWayPoints();
GenerateNPCTreasure();

object oStore = GetObjectByTag("tagdumagasin");
object oStock = GetFirstItemInInventory(oStore);
int n, nStock;
n=0;
while (GetIsObjectValid(oStock))
{
n++;
nStock = GetNumStackedItems(oStock);
SetLocalString(oStore, "oItem"+IntToString(n), GetResRef(oStock)+";"+IntToString(nStock));
oStock = GetNextItemInInventory(oStore);
}
SetLocalInt(oStore, "nItem", n);
int nDay = GetCalendarDay()+7;
int nMonth = GetCalendarMonth();
int nYear = GetCalendarYear();
if (nDay > 30)
{
nDay = nDay-30;
nMonth = nMonth+1;
if (nMonth > 12)
{
nYear++;
nMonth = 1;
}
}
SetLocalInt(oStore, "nDay", nDay);
SetLocalInt(oStore, "nMonth", nMonth);
SetLocalInt(oStore, "nYear", nYear);
}


OnHeartbeat :


void main()
{
object oStore = GetObjectByTag("tagdumagasin");

if (GetLocalInt(oStore, "nDay") <= GetCalendarDay()
&& GetLocalInt(oStore, "nMonth") <= GetCalendarMonth()
&& GetLocalInt(oStore, "nYear") <= GetCalendarYear())
{
SignalEvent(OBJECT_SELF, EventUserDefined(666));
}
}


OnUserDefined :


void main()
{
int nUser = GetUserDefinedEventNumber();

switch (nUser)
{
case 666 :
{
object oStore = GetObjectByTag("tagdumagasin");
int nItem = GetLocalInt(oStore, "nItem");
int n;

object oStock = GetFirstItemInInventory();
while (GetIsObjectValid(oStock))
{
DestroyObject(oStock);
oStock = GetNextItemInInventory();
}

for (n = 1; n 30)
{
nDay = nDay-30;
nMonth = nMonth+1;
if (nMonth > 12)
{
nYear++;
nMonth = 1;
}
}
SetLocalInt(oStore, "nDay", nDay);
SetLocalInt(oStore, "nMonth", nMonth);
SetLocalInt(oStore, "nYear", nYear);
}
default :
}
}


Ne pas oublier de mettre le tag du magasin à sa place.
Ca devrait marcher mais je ne suis pas sûr que les magasins soit gérés exactement comme des inventaires et de toutes façons il est fort probable que les objets en quantité infinie lui pose problème, je te recommande donc de faire ton stock en pensant à cette dernière restriction : pas d'objet en quantité infinie, mais après tout c'est plus logique (mais où mettent-ils tous ces batons). :cool:

A noter aussi qu'il te faut impérativement la 1.25 pour la commande GetResRef().

Par Simkim le 13/10/2002 à 15:36:53 (#2328093)

Jai coché plot pour le marchand donc il ne risque pas de mourir.

Tous les objets sont en quantité limité donc pas de problème à ce niveau là.

Le seul problème est que je suis en 1.24 (jaurais pas du désinstaller la VO).
En attendant le patch, ce serait sympa si tu pouvais mexpliquer lintérêt de GetResRef par rapport à GetObjectByTag. Les deux sont censés désignés un seul et unique objet alors je comprend pas pourquoi lun est mieux que lautre. Normalement ils veulent dire la même chose, non ?

Pour la question 2, javais pensé me servir dune customisation entre le Bulletin Board System et le script de Bounty Hunter. Le problème est que jen suis encore à les décrypter et à comprendre comment ils marchent.

Merci pour la réponse à la question 1.
:merci:

Par Jedaï le 13/10/2002 à 16:10:42 (#2328271)

GetResRef() permet d'obtenir le BLUEPRINT d'un objet, c'est à dire le nom du modèle de cet objet. GetTag() permet d'obtenir le TAG d'un objet, c'est à dire le nom qui désigne un objet déjà dans le module. Il arrive que le tag d'un objet soit identique au blueprint du modèle de cet objet mais c'est assez rare. Toutes les fonctions qui CREENT des objets utilisent évidemment le BLUEPRINT puisqu'elles créent l'objet à partir d'un modèle. :lit:
J'ai néanmoins constaté que parfois le tag marchait (jamais quand on a changé ce tag après la création de l'objet évidemment), tu peux donc essayer en remplaçant GetResRef() par GetTag() mais je ne garantis pas du tout le résultat...

Par Tyn' le 13/10/2002 à 16:26:02 (#2328355)

Dans les objets de BioWare, tag = blueprint. Mais uniquement dans ceux-ci.

Par Jedaï le 13/10/2002 à 19:42:57 (#2329426)

Ouais, effectivement, bien que le tag et le blueprint ne soit pas identique chez les objets biowares , visiblement, on peut se servir de l'un ou l'autre... tant qu'on n'as pas modifié le tag évidemment !
Bioware a du mettre en place une bibliothèque qui associe son blueprint à chacun des tag "standard". Ce doit être pour cela que ce n'est valable que pour leurs objets, pour nous pauvres manants ne reste que la solution de créer des objets qui ont par défaut le tag identique au blueprint...

JOL Archives 1.0.1
@ JOL / JeuxOnLine