Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > des questions, plein plein
des questions, plein plein
Par ochimo le 16/12/2002 à 10:49:15 (#2800515)
Voilà quelques ptites questions que je soumets à la réflexion commune de ce forum (avec des numéros comme ça vous pouvez cibler vos réponses).
1- jai un pnj qui peut devenir compagnon du joueur, mais je voudrais quà un certain stade de laventure il le quitte (en passant sur une zone déterminée par exemple ). Le pnj ne doit pas disparaître mais juste faire ses adieux et rester statique à cet endroit.
2- je joue dans un environnement oriental, mais à chaque fois que je mets un contenant, il est automatiquement rempli de babioles quand le joueur louvre (en plus de ce que jy ai mis moi) ; ces dites babioles ne vont pas du tout avec mon environnement (objets occidentaux), comment puis je annuler ce trésor automatique de mes contenants ?
3- si je prends le contrôle dun pnj dont le dialogue permettait louverture dun magasin, ce dernier nest donc plus accessible au joueurcomment puis je ouvrir un magasin pour un joueur en tant que dm ?
4- Il y a eu un post il y a quelque temps à propos de la possibilité de vider linventaire dun joueur au passage sur une zone, deux solutions étaient proposées, jai essayé les deux mais sans succès, quelquun aurait il un scrip simple à mettre dans le on enter dune zone au sol (mais qui ne doit fonctionner quune fois car le pj peut repasser par là plus tard ds laventure ! ! !)
5- Lors de lactivation dune rencontre, le monstre arrive au spawnpoint, comment puis je faire pour quil se déplace suivant un certain parcours à son arrivée ? (je sais le faire avec des monstres placés, mais pas quand ils ne sont pas là
Merci encore de votre aide, jen profite pour repasser mon message habituel, que ceux qui ont des éléments orientaux dans leur ressource me fasse signe, je suis preneur (autre que ceux déjà en ligne sur http://ochimo.free.fr ). Encore merci.
:merci: ochimo
Par Elminf le 16/12/2002 à 12:17:37 (#2801507)
pour la 2
Par ochimo le 16/12/2002 à 17:47:53 (#2805010)
Par Jedaï le 16/12/2002 à 20:04:12 (#2806452)
La solution est simple, crée toi un script "void", qui est réduit à son strict minimum :
void main(){}
Et met ce script à la place des scripts par défauts que tu veux supprimer. Ici il faut supprimer le OnOpen (et peut-être le OnSpawn).:cool:
4. Pourrait-tu nous expliquer exactement ce que tu as fait et nous mettre ton script, normalement les scripts proposés marchent donc....:confus:
Par ochimo le 16/12/2002 à 20:42:52 (#2806874)
Pour le 4, j'ai créé un déclancheur autour du point d'arrivée (je veux que le pj se retrouve sans rien au début du scénar), et dans le onenter du déclancheur j'ai mis un script avec:
void main()
{
void viderInventaire(object cible, object contenant=OBJECT_INVALID)
{
int i;
object item;
object copiItem;
while((item = GetNextItemInInventory(cible)) != OBJECT_INVALID){
if(contenant != OBJECT_INVALID){
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
for(i = 0 ; i <= NUM_INVENTORY_SLOTS ; i++){
item = GetItemInSlot(i,cible);
if(contenant != OBJECT_INVALID){
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
}
}
et ça ne marche pas...
merci d'avance pour cette question ou pour les autres
Re: des questions, plein plein
Par Taern le 16/12/2002 à 21:32:28 (#2807413)
Provient du message de ochimo
2- je joue dans un environnement oriental, mais à chaque fois que je mets un contenant, il est automatiquement rempli de babioles quand le joueur l'ouvre (en plus de ce que j'y ai mis moi) ; ces dites babioles ne vont pas du tout avec mon environnement (objets occidentaux), comment puis je annuler ce trésor automatique de mes contenants ?
Comme Elminf l'a dit, il suffit d'enlever le script par défaut de Bioware sur les évenements OnOpen et OnDeath du contenant. Si tu les as enlevé, alors c'est bon :) ne t'occupe pas du choix entre "trésor", "os", "sac" etc., ceci concerne autre chose.Provient du message de ochimo
3- si je prends le contrôle d'un pnj dont le dialogue permettait l'ouverture d'un magasin, ce dernier n'est donc plus accessible au joueur; comment puis je ouvrir un magasin pour un joueur en tant que dm ?
Seule la commande de script OpenStore() le permet. De manière simple, c'est donc impossible de simuler un pnj marchand en étant MJ, tout du moins en conservant l'interface classique. Tu peux soit faire les transactions manuellement (par dialogue et échange d'objet, mais le problème c'est le prix des objets). Tu peux aussi scripter tout ça (galères en perspective ;) ).
Re: des questions, plein plein
Par loyus le 17/12/2002 à 2:58:57 (#2809901)
Provient du message de ochimo
4- Il y a eu un post il y a quelque temps à propos de la possibilité de vider linventaire dun joueur au passage sur une zone, deux solutions étaient proposées, jai essayé les deux mais sans succès, quelquun aurait il un scrip simple à mettre dans le on enter dune zone au sol (mais qui ne doit fonctionner quune fois car le pj peut repasser par là plus tard ds laventure ! ! !)
ça dépend de ce que tu veux exactement.
Si tu veux juste appliquer ton script à ta zone d'accueil sur le module (que les nouveaux joueurs perdent leur équipement à leur entrée), alors pas de problème. Mais si tu veux autre chose c'est plus compliqué.
Quoi qu'il en soit, si ça doit juste arriver une fois au nouveaux joueurs, la solution simple consiste à créer un script dans le OnEnter de ta zone.
"Si le joueur a 0 pt d experience, alors je lui enlève tout son équipement et je lui donne 1 pt d experience.
Si le joueur n'a pas 0 pt d experience, alors je ne fais rien".
Voilà pour la version simple, mais si tu veux le script complet il faut d'abord être sûr que c'est bien l'effet que tu recherches ;)
pour la 3
Par sounéva le 17/12/2002 à 3:15:19 (#2809952)
il existe d'ailleurs une fonction DM pour arrêter/remettre l'IA des objet.
Par Taern le 17/12/2002 à 18:50:37 (#2815566)
Provient du message de ochimo
Pour le 4, j'ai créé un déclancheur autour du point d'arrivée (je veux que le pj se retrouve sans rien au début du scénar), et dans le onenter du déclancheur j'ai mis un script avec:
void main()
{
void viderInventaire(object cible, object contenant=OBJECT_INVALID)
{
int i;
object item;
object copiItem;
while((item = GetNextItemInInventory(cible)) != OBJECT_INVALID){
if(contenant != OBJECT_INVALID){
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
for(i = 0 ; i <= NUM_INVENTORY_SLOTS ; i++){
item = GetItemInSlot(i,cible);
if(contenant != OBJECT_INVALID){
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
}
}
et ça ne marche pas...
Le problème vient du fait que tu déclare une fonction, en l'occurence viderInventaire(object cible, object contenant=OBJECT_INVALID), à l'intérieur de la fonction main().
Pour résoudre le problème, tu as le choix :
1/ tu déclare ta fonction à l'extérieur de la fonction main(), et tu l'appelle ensuite dans cette dernière :void viderInventaire(object cible, object contenant=OBJECT_INVALID) //Début de la déclaration de la fonction
{
int i;
object item;
object copiItem;
while((item = GetNextItemInInventory(cible)) != OBJECT_INVALID){
if(contenant != OBJECT_INVALID){
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
for(i = 0 ; i <= NUM_INVENTORY_SLOTS ; i++){
item = GetItemInSlot(i,cible);
if(contenant != OBJECT_INVALID){
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
} //Fin de la fonction viderInventaire(
void main() //Début du script
{
object oPJ = GetEnteringObject(); //Ici on désigne le PJ comme étant le dernier à etre entré dans le trigger
viderInventaire(oPJ); //Et on éxécute la fonction sur lui
}
2/ Tu ne déclare pas de fonction, tu te contente d'appliquer le script au PJ :void main() //Début du script
{
object cible = GetEnteringObject(); //Ici on désigne le PJ comme étant le dernier à etre entré dans le trigger
object contenant = OBJECT_INVALID;
int i;
object item;
object copiItem;
while((item = GetNextItemInInventory(cible)) != OBJECT_INVALID){
if(contenant != OBJECT_INVALID){
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
for(i = 0 ; i <= NUM_INVENTORY_SLOTS ; i++){
item = GetItemInSlot(i,cible);
if(contenant != OBJECT_INVALID){
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
}
Je n'ai pas vérifié que les scripts que je propose se compilent, désolé :o
J'espère que ça t'aideras quand même :ange:
oooook
Par ochimo le 17/12/2002 à 19:12:16 (#2815793)
je vais tester tout ça
Par coolstar le 18/12/2002 à 3:28:46 (#2819412)
J'ai juste cherché à savoir si déjà tes Script se compilaient, ce qui n'est pas le cas du 2e... vu que n'avais pas déclarés 'cible' &'contentant'... alors... :ange: void main() //Début du script
{
object cible = GetEnteringObject(); //Ici on désigne le PJ comme étant le dernier à etre entré dans le trigger
object contenant = OBJECT_INVALID;
int i;
object item;
object copiItem;
while((item = GetNextItemInInventory(cible)) != OBJECT_INVALID)
{
if(contenant != OBJECT_INVALID)
{
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
for(i = 0 ; i <= NUM_INVENTORY_SLOTS ; i++)
{
item = GetItemInSlot(i,cible);
if(contenant != OBJECT_INVALID)
{
copiItem = CreateItemOnObject(GetTag(item), contenant);
SetPlotFlag(copiItem, GetPlotFlag(item));
SetIdentified(copiItem, GetIdentified(item));
}
DestroyObject(item);
}
}
Par Taern le 18/12/2002 à 20:13:44 (#2825653)
Par coolstar le 19/12/2002 à 1:52:57 (#2828215)
genial
Par ochimo le 19/12/2002 à 12:19:07 (#2830251)
bien a vous:merci: ochimo
Par Taern le 19/12/2002 à 15:50:47 (#2831897)
Par coolstar le 19/12/2002 à 19:34:05 (#2833903)
JOL Archives 1.0.1
@ JOL / JeuxOnLine