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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

c'est comment qu'on fait ?

Par Le Hamster le 23/8/2002 à 16:55:25 (#2013113)

Bon, voilà, j'explique :

Je fais un module pour des persos de petits niveaux. Dans mon histoire, il y a un gros méchant qui est vraiment trop fort pour les PC (appelons le Dragon, Tag : Dragon).

Il y a aussi 5 autres monstres qui eux, sont du niveau des PC. Chacun d'entre eux porte un objet ( Tags : "objet1", objet2",..."objet5"). Quand on les tuent ils droppent chacun leur objet.

Je voudrais que ces objets, mis dans un seul inventaire se regroupent en un seul objet (Tag "objet6") qui soit capable de tuer le Dragon d'un seul coup.

Le must étant que le dragon en disparaissant se transforme en chien docile.

S'il vous plait, ne soyez pas trop nébuleux, je rappelle à ceux qui m'ont déjà croisés sur ce forum que je suis, malheureusement, réfractaire à la programmation.

Bises à toutes et à tous

Par Mellinsa le 23/8/2002 à 18:02:45 (#2013710)

Tu pourrais faire une conversation avec le dragon, qui enclenche seulement si on a les 5 objets, puis tu détruit le dragon pour le remplcer par un chien, ça doit donner quelque chose comme :

Dragon dis de quoi
Ds text apear when:

#include "nw_i0_tool"

int StartingConditional()
{

// Make sure the PC speaker has these items in their inventory
if(!CheckPartyForItem(GetPCSpeaker(), "object1"))
return FALSE;
if(!CheckPartyForItem(GetPCSpeaker(), "object2"))
return FALSE;
if(!CheckPartyForItem(GetPCSpeaker(), "object3"))
return FALSE;
if(!CheckPartyForItem(GetPCSpeaker(), "object4"))
return FALSE;
if(!CheckPartyForItem(GetPCSpeaker(), "object5"))
return FALSE;

return TRUE;
}

Même phrase mais action taken:

void main()
{
// Give the speaker the items
CreateItemOnObject("object6", GetPCSpeaker(), 1);


// Remove items from the player's inventory
object oItemToTake;
oItemToTake = GetItemPossessedBy(GetPCSpeaker(), "object1");
if(GetIsObjectValid(oItemToTake) != 0)
DestroyObject(oItemToTake);
oItemToTake = GetItemPossessedBy(GetPCSpeaker(), "object2");
if(GetIsObjectValid(oItemToTake) != 0)
DestroyObject(oItemToTake);
oItemToTake = GetItemPossessedBy(GetPCSpeaker(), "object3");
if(GetIsObjectValid(oItemToTake) != 0)
DestroyObject(oItemToTake);
oItemToTake = GetItemPossessedBy(GetPCSpeaker(), "object4");
if(GetIsObjectValid(oItemToTake) != 0)
DestroyObject(oItemToTake);
oItemToTake = GetItemPossessedBy(GetPCSpeaker(), "object5");
if(GetIsObjectValid(oItemToTake) != 0)
DestroyObject(oItemToTake);
}

Puis dans la réponse des Pj
action taken

void main()
{
DestroyObject(OBJECT_SELF);
object oWP1 = GetObjectByTag("b1");
location lSpawnPoint1 = GetLocation(oWP1);
CreateObject(OBJECT_TYPE_CREATURE, "NW_DOG", lSpawnPoint1, FALSE);

}

ça te prend un wp nommé b1 en dessous du dragon et je sais pas quel effet ça donne graphiquement. G fait le tout grace au script wizard et à un script donné sur ce forum.

Par Kemay le 23/8/2002 à 18:21:57 (#2013886)

Je voudrais que ces objets, mis dans un seul inventaire se regroupent en un seul objet (Tag "objet6")

Dans Edit/Module properties. Onglet Events.
Tu places le le script suivant dans l'event onAcquireItem:
void main()
{
//Definir oAcquired comme etant l'objet acquis
object oAcquired = GetModuleItemAcquired();
//Definir oPC comme etant la creature qui vient d'acquerir oAcquired
object oPC = GetItemPossessor(oAcquired);
//Verifier si oAcquired est l'un des cinq objets
if( GetTag(oAcquired) == "objet1" || GetTag(oAcquired) == "objet2" || GetTag(oAcquired) == "objet3"
|| GetTag(oAcquired) == "objet4" || GetTag(oAcquired) == "objet5" )
{
//si oui verifier que oPC possede les cinq objets
object oObjet = GetItemPossessedBy(oPC,"objet1");
int nObjet = 1;
while( oObjet != OBJECT_INVALID && nObjet <=5 )
{
oObjet = GetItemPossessedBy(oPC,"objet"+IntToString(nObjet));
nObjet++;
}
//si oui dtruire les cinq objets et creer objet6 dans l'inventaire de oPC
if( oObjet != OBJECT_INVALID )
{
for( nObjet = 1; nObjet <= 5; nObjet++)
{
oObjet = GetItemPossessedBy(oPC,"objet"+IntToString(nObjet));
DestroyObject(oObjet);
}
CreateItemOnObject("objet6",oPC);
}
}
}

Note: L'objet6 doit avoir pour tag ET pour BlueprintResRef "objet6".
un seul objet (Tag "objet6") qui soit capable de tuer le Dragon d'un seul coup.

Le must étant que le dragon en disparaissant se transforme en chien docile.

Dans Edit/Module properties. Onglet Events.
Tu places le le script suivant dans l'event onActivateItem:
void main()
{
//Definir oObjet comme etant l'objet qui vient d'etre active
object oObjet = GetItemActivated();
//Definir oCible comme etant la cible de l'objet active
object oCible = GetItemActivatedTarget();
//Definir lCible comme la localisation de oCible
location lCible = GetItemActivatedTargetLocation();
//Definir oPC comme etant la creature qui active oObjet
object oPC = GetItemActivator();
//Si oObjet est objet6
if( GetTag(oObjet)=="objet6" )
{
//et si oCible est le dragon
if( GetTag(oCible)=="Dragon" )
{
//Detruire le dragon
DestroyObject(oCible);
//et le remplacer par un chien
//Si tu veux enlever l'effet visuel efface ",TRUE" dans la ligne qui suit
CreateObject(OBJECT_TYPE_CREATURE,"nw_dog",lCible,TRUE);
//Detruire objet6
//Si tu ne veux pas que objet6 soit detruit apres utilisation sur le dragon,efface la ligne qui suit
DestroyObject(oObjet);
//Recompenser l'equipe du joueur qui a detruit le dragon en XP
//Remplace 500 par le nombre d'xp que tu veux donner dans la ligne qui suit
int nReward = 500;
object oMember = GetFirstFactionMember(oPC);
while( oMember != OBJECT_INVALID )
{
GiveXPToCreature(oMember,nReward);
oMember = GetNextFactionMember(oPC);
}
}
}
}

Voilà, cela devrait marcher. Je n'ai pas le temps de tester pour l'instant alors s'il y a un problème avec ces scripts, n'hésite pas à demander.

[EDIT] Modif du script onAcquire cf discussion ci-dessous [/EDIT]

ça marche pas.

Par Le Hamster le 24/8/2002 à 14:55:55 (#2018751)

Déjà, j'essaie de faire fonctionner le premier de tes deux scripts Kemay.


ça ne marche pas. Mais je ne remets pas en doute mes incapacités.

Peut-être faut-il placer l'objet 6 quelque part ?

Peut-être faut-il que tous les blueprintres soient "objets" ?

hein ?

ou autre chose.

Par Kemay le 24/8/2002 à 17:17:37 (#2019272)

Quand tu dis ça marche pas, qu'est ce qui ne marche pas ? les cinq objets ne sont pas détruits ? l'objet 6 n'apparaît pas , il se passe rien ?

Pour répondre à ta question les 5 objets (ayant pour tag "objet1" à "objet5" exactement écrit comme ça pas de majuscule ou ca ne marchera pas), leur blueprintResRef n'a pas d'importance. Par contre pour l'objet 6 sont tag ET son blueperintResRef doivent être tous es deux "objet6").

L'objet 6 n'a pas besoin d'être placé dans le module MAIS il doit être dans la "custom palette". les autres objets sont forcément dans le module puisque ça ne marche que lorsqu'un joueur a les cinq.

je vais être plus précis

Par Le Hamster le 24/8/2002 à 18:00:14 (#2019449)

j'ai créée les objets avec les tags bien écrits et le 6 aussi. (on dirait un chanson)

Le PC peut prendre les objets, ceux-ci se retrouvent dans l'inventaire mais rien ne se passe.

Ce sont des objets customs miscellanous thin et le 6ème miscellanous large. (je mets tout ce qui me passe par la tête)

Le 6ème est bien dans la custom palette (special custom 5, tous comme tous les morceaux).

pfffffffffff c'est dur la création.

Par Jedaï le 24/8/2002 à 19:47:05 (#2020043)

Superbe script Kemay mais malheureusement tu as fais une toute petite erreur de logique dans ta fonction OnAcquire dans ta boucle While... Elle s'arrête quand ton objet est invalide donc le test if juste après ne se déclenche pas (oObjet est invalide).

Je propose donc de remplacer la condition de ce if :
(oObjet != OBJECT_INVALID)
par :
(nObjet == 6)
qui prouve bien que les cinq premiers objets ont été vérifiés.

Par Kemay le 24/8/2002 à 19:56:39 (#2020079)

non =) le while ne s'exécute pas lorsque nObjet est égal à 6 =) lorsque nObjet = 6, oObjet est en fait l'objet ayant pour tag "Objet5". Cela dit ton idée pourrait simplifier le script, je n'ai pas le temps de faire les modifs maintenant, j'verrai ça tout à l'heure =)

Si, si

Par Jedaï le 24/8/2002 à 20:39:58 (#2020236)

Je t'assure : ton nObjet est = à 5 et ton oObjet est "objet5" (valide), donc while est d'accord, nObjet devient 6 et oObjet devient "objet6" (non valide bien sûr), while ne s'exécute pas mais le if non plus.

Par contre j'ai trouvé une solution + simple :
il suffit de mettre le nObjet++; après le oObjet =... et non avant, dans ce cas oObjet sera "objet5" quand nObjet sera 6 et interrompra la boucle avec un objet valide.

On peut aussi mettre nObjet < 5 au lieu de nObjet <= 5 et ce sera alors le if qui vérifiera si "objet5" est bien dans l'inventaire.

Plein de solution mais je t'assure qu'il y a vraiment une petite erreur.

Par Kemay le 24/8/2002 à 20:48:11 (#2020278)

Oups, oui j'aurai dû faire plus attention, j'étais persuadé que nObjet++; était après le oObjet=... :rolleyes:

Tu as raison il suffit d'inverser l'ordre des deux :)

oiiiiiiiiiiiiinnnnnnnnnnnn

Par Le Hamster le 24/8/2002 à 23:19:57 (#2020929)

Je comprends rien ! je sais plus ce qu'il faut modifier ou pas.

Juste un point de détail, mon histoire, metteur en scène oblige (c'est mon boulot), n'est ABSOLUMENT pas linéaire. Les PC peuvent donc trouver les "morceaux" (objets) dans le désordre !

ne m'en veuillez pas, il y a si longtemps que je suis allé à l'école et en plus, j'y ai rien appris !

Mais puis-je avoir le script relibellé correctement ?

Merci. Bisous vous êtes des anges.

Par Jedaï le 25/8/2002 à 10:01:16 (#2022242)

Si tu ne l'as pas déjà vu, Kemay a édité son post initial : le script est maintenant bon.:)

JOL Archives 1.0.1
@ JOL / JeuxOnLine