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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Help pour un script de transition

Par Cassin le 5/9/2002 à 16:19:12 (#2102030)

Salut !

En juin ou juillet quelques-uns ici m'avaient aidés :merci: à monter un script afin de ne pouvoir passer une porte si le joueur avait un uniforme bien spécifique sur lui.
(à ce propos, le script marche mais ne se compile pas, j'ai pas tout compris là... :doute: )

Et là j'avais besoin d'un script similaire (donc j'ai repris les bases de l'autre) mais il ne fonctionne pas...
La situation est la suivante : le joueur est dans un temple et il récupère une arme magique. Par esprit équitable, le joueur peut choisir quelle arme il veut (bâton, épée, hache, etc...), mais UNE SEULE évidemment.
Ce que je voudrais faire, c'est que si le joueur sort du temple avec une de ces armes, les orcs du camp à l'extérieur l'attaquent ; s'il sort sans l'arme, qu'ils le laissent en paix.

J'ai donc fait ceci :

object oClicker = GetClickingObject();
object oTarget = GetTransitionTarget(OBJECT_SELF);
location lLoc = GetLocation(oTarget);

void main()
{
if ( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("Hache2mMGK", 0) ) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("HallebardeMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("Hache1mMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("BatardeMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("DagueMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("Epee2mMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("EpeeLMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("EpeeCMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("FleauMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("MarteauMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("MasseMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("EtoiledumatinMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("BatonMGK", 0) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("LanceMGK", 0) )

AdjustReputation(GetClickingObject(), OBJECT_SELF, -100);
DetermineCombatRound(GetClickingObject());

AssignCommand(oClicker,JumpToLocation(lLoc));

else
AssignCommand(oClicker,JumpToLocation(lLoc));
}


mais quand je clique sur l'area transition de la porte, il ne se passe rien (je ne sors pas), que j'ai l'arme sur moi ou non...

Où est mon erreur ? :doute:

Par miriandel le 5/9/2002 à 16:39:53 (#2102166)

A première vue, je peux me tromper, tu le fais jumper... là où il est déjà.

Par Kemay le 5/9/2002 à 16:47:47 (#2102208)

Où est mon erreur ? :doute:

Il y en a plusieurs:
- d'abord le if s'arrête après la première vérification à cause d'une parenthèse en trop
- ensuite tu vérifies si l'armure que porte oClicker est une arme ;)
- dans le cas où oCliquer porterait une des armes comme armure, tu dis à la porte d'être hostile au joueur et de l'attaquer.
- il y a plusieurs erreurs de syntaxe aussi, ça 'étonne que ce script se compile

De toute façon si je comprends bien ce que tu veux faire, tu as meilleur temps de placer un script dans l'event onEnter de l'area où se trouve tes orcs. Tu verifies si l'obet entrant dans la zone est un PC, si oui tu verifies s'il possède une de tes armes spéciales (GetItemPossessedBy() ), et si oui tu modifies la faction des orcs en hostile.

Par Cassin le 5/9/2002 à 21:11:59 (#2104402)

> - ensuite tu vérifies si l'armure que porte oClicker est une arme

:D OK, d'accord... ;)

> - dans le cas où oCliquer porterait une des armes comme
> armure, tu dis à la porte d'être hostile au joueur et de
> l'attaquer.

En effet, j'ai pas tout compris...


> - il y a plusieurs erreurs de syntaxe aussi, ça 'étonne que ce
> script se compile

Non, le script ne se compile pas, évidemment.
Par contre l'autre, pour la porte, ne se compile pas non plus MAIS il marche ! Va comprender !
En fait je crois que l'éditeur n'aime pas les ||, il ne doit pas les comprendre.


Bon, il ne me reste plus qu'à plancher là-dessus alors !

Par Cassin le 6/9/2002 à 9:41:28 (#2106430)

Bon, finalement j'ai décidé de ne pas mettre de || qui semble ne pas être accepté et de faire une suite de if

Pour l'instant j'ai ça (/!\ ce n'est pas terminé !)

object oClicker = GetClickingObject();
object oTarget = GetTransitionTarget(OBJECT_SELF);
location lLoc = GetLocation(oTarget);

void main()
{
if(!CheckPartyForItem(GetClickingObject(), "BatardeMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "BatonMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "DagueMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "Epee2mMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "EpeeCMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "EpeeLMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "EtoiledumatinMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "FleauMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "Hache1mMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "Hache2mMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "HallebardeMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "LanceMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "MarteauMGK"))
return FALSE;
if(!CheckPartyForItem(GetClickingObject(), "MasseMGK"))
return FALSE;

AssignCommand(oClicker,JumpToLocation(lLoc));
}


Et j'ai une erreur sur la ligne du premier if (donc j'imagine que j'aurais la même sur tous les if suivants...) : "ERROR: NO RIGHT BRACKET ON EXPRESSION".

Qu'est-ce que ça veut dire ? Est-ce que j'ai une parenthèse droite en plus ? En moins ? Et où ? Je vois pas du tout !

Par Fredegar le 6/9/2002 à 12:06:48 (#2107144)

Bon je ne sais pas pour le pb de compilation avec les parenthèses. Mais par contre je pense que cette méthode ne marchera pas. Je m'explique :
Si le joueur à le fléau par exemple. Et bien le code va voir qu'il n'a pas l'épée batarde "BatardeMGK" et va faire 'return false' et donc il quitte le main. Je ne sais pas si je me suis bien exprimé.:)
A la limite essaye ça. (Je suis au boulot je ne peux pas tester)


void main()
{
object oClicker = GetClickingObject();
object oTarget = GetTransitionTarget(OBJECT_SELF);
location lLoc = GetLocation(oTarget);
int iPossessed = 0;

if(CheckPartyForItem(GetClickingObject(), "BatardeMGK"))
iPossessed = 1;
//on fait ça pour tous les objets...

//si on a l'objet on téléporte
if (iPossessed)
AssignCommand(oClicker,JumpToLocation(lLoc));
}


J'espère que ça va fonctionner:)
Bonne chance

Par LeProctophantasmiste le 6/9/2002 à 13:47:58 (#2107785)

CheckPartyForItem() est défini dans nw_i0_plot et nw_i0_tools je crois. Tu n'as pas fait l'include donc le compilateur est perdu.

Si tu suis les conseils de Kemay et place le script dans l'area OnEnter GetItemPossessedBy(oCreature, sItemTag) est parfait, et a l'avantage d'être une fonction de base, tu traitera les joueurs "séparéments".

Note que GetItemPossessedBy fera très bien l'affaire dans l'approche que tu suis pour l'instant, je mentionne juste le conseil de Kemay parce qu'il me semble sue pour l'instant tu te complique la vie (pourquoi faire la transition à la main quand tu pourrais utiliser le toolset).

Une approche très différente du pbm serait de déclancher l'inimitié des orcs quand l'objet est pris par le PC (la méthode pour le faire dépend du contexte mais le recours au module OnAcquire serait probablement inutile)


Pense à vérifier que la créature entrante est un PC:


void main()
{
object oPC = GetEnteringObject();
if(GetIsPC(oPC))
{
....



Sinon || marche très bien ;) Et Fredegar a absolument raison.

Voilà j'ai très peu de temps devant moi, j'espère t'avoir aidé

Par Cassin le 7/9/2002 à 15:38:54 (#2114753)

Je crois aussi que je vais changer de méthode...

Malheureusement je ne peux le faire ce week-end, je n'ai pas le module (ou du moins, la dernière version) sous la main... :(

hop !

Par Jedaï le 8/9/2002 à 21:55:04 (#2122460)

Voilà un script qui marche :

void main()
{
object oClicker = GetClickingObject();
object oTarget = GetTransitionTarget(OBJECT_SELF);
location lLoc = GetLocation(oTarget);
object oOrc = GetObjectByTag("Tag d'un garde orc");

if ( !(GetItemPossessedBy (oClicker, "Hache2mMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "HallebardeMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "Hache1mMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "BatardeMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "DagueMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "Epee2mMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "EpeeLMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "EpeeCMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "FleauMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "MarteauMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "MasseMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "EtoiledumatinMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "BatonMGK")== OBJECT_INVALID) ||
!(GetItemPossessedBy(oClicker, "LanceMGK")== OBJECT_INVALID) )
AdjustReputation(oClicker, oOrc, -100);

AssignCommand(oClicker,JumpToLocation(lLoc));
}

Par Cassin le 9/9/2002 à 11:15:47 (#2124589)

En effet, il marche à la perfection !

Vraiment, MERCI Jedaï !!! :merci: :merci: :merci:

Je n'en attendais pas tant ! Et en plus il me servira de base pour un autre script du même genre !


THX !!!

JOL Archives 1.0.1
@ JOL / JeuxOnLine