Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Help pour un script de transition
Help pour un script de transition
Par Cassin le 5/9/2002 à 16:19:12 (#2102030)
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)
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)
: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)
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)
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)
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)
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)
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)
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