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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

[Script]Ouverture d'une porte via un levier

Par Elmo le 20/5/2002 à 17:57:16 (#1495215)

Le script que je proposais etant devenu inutile, je l'enlève donc.

Par Uther le 20/5/2002 à 19:23:42 (#1495850)

Je stick ce sujet. Je crois qu'il pourrait être intéressant que les NWScripteurs postent, à la suite de ce message, leurs propres contributions, les expliquent, etc. afin de les partager avec les autres créateurs de modules.

Pour une meilleure lisibilité, merci de ne pas commenter / discuter au sein de ce sujet. En cas de questions, difficultés à utiliser les scripts proposés, merci d'ouvrir un autre sujet (j'effacerai / déplacerai les messages hors sujets).

Merci pour vos contributions. :merci:

Merci Elmo, de lancer ce mouvement. ;)

Par Elmo le 3/6/2002 à 11:23:53 (#1582400)

bon comme c'est dead, voici le script permettant de faire s'asseoir un perso (à mettre dans la catégorie "OnSpawn")

void main()
{
object oChair = GetNearestObjectByTag("tagdelachaise");
ActionSit(oChair);
}


ps: De rien Uther ;)

Par Tormax le 21/6/2002 à 0:13:42 (#1687478)

Voici un script tout simple qui vous permet d' "auto-binder" un lieu (Waypoint taggé "WP_depart_nain") pour un joueur en fonction de sa race (Nain dans cet exemple).




void main()
{
object oJoueur = GetEnteringObject ();
int iRaceDuJoueur = GetRacialType (oJoueur);
switch (iRaceDuJoueur) {
case RACIAL_TYPE_DWARF :
location ldepart_nain = GetLocation (GetObjectByTag ("WP_depart_nain"));
AssignCommand (oJoueur, ActionJumpToLocation (ldepart_nain));
break;
}
}


A placer dans le On.Enter

Par Tormax le 21/6/2002 à 17:36:03 (#1690932)

Script pompé sur les forums de BioWare que j'ai trouvé super intéressant.
Il vous permet de faire apparaître un monstre (Goblin1) à 6 emplacements de manière aléatoire.


Voici le script en question:


void main()
{
// Définir la range de chiffre à prendre aléatoirement (1-6)
int nRandomNumber = d6(1);
// Créer le WayPoint Tag aléatoirement.
string sWaypoint = "WP_Goblin_Spawn_" + IntToString(nRandomNumber);
// Récupérer la loc de l'object
object oWaypoint = GetObjectByTag(sWaypoint);
// Faire apparaitre Goblin1 au WayPoint défini aléatoirement
object oGoblin= GetObjectByTag("Goblin1");
AssignCommand(oGoblin, JumpToObject(oWaypoint));
}


Nécessités:
1/ Placer ce script dans le OnSpawn de 'Goblin1'
2/ Placer 6 waypoints nommés WP_Goblin_Spawn_x (ou x=1 à 6)

Par Eliossar le 23/6/2002 à 6:02:18 (#1697906)

Bon alors je ne sais pas si le post du script d' Elmo pour s'assoir marche ms j'en ai fait un autre. Mais cette fois ci qui est dans les propriétés de la chaise.
Mettre useable pour la chaise
ensuite dans OnUsed mettre


void main()
{
object chaise;

//le tag de la chaise
chaise = GetObjectByTag("tagdelachaise");

//fait agir l'object le plus proche de la chaise cad le joueur
//l'action est de s'assoir
AssignCommand(GetNearestObject(OBJECT_TYPE_CREATURE,chaise,1),ActionSit(chaise));

//cette partie permet juste de faire le test
//pour savoir si l'object est bien trouve
//s'il ne l'ai pas alors le jeu quitte dans ce cas
if (chaise == OBJECT_INVALID)
EndGame("End");

}


Donc ce script permet de faire s'assoir n'importe quel joueur.
Ne pas mettre un objet trop pret de la/des chaise(s) pour pas géner le joueur pour s'assoir et surtout pour ne pas que avoir de conflit lors de la détection de l'objet le plus proche. Il faut que le joueur soit le plus proche objet de la chaise pour que ça marche sinon je pense que ça marchera pas.

S'asseoir ter

Par talendil le 23/6/2002 à 11:23:13 (#1698311)

Salut,
sympa ton script, Eliossar !
Mais y'a un truc qi m'échappe :confus:
Je ne comprends pas pourquoi tu utilises la constante OBJECT_TYPE_ALL plutôt que OBJECT_TYPE_CREATURE dans cette partie du code :

AssignCommand(GetNearestObject(OBJECT_TYPE_ALL,chaise,1),ActionSit(chaise));


A mon avis, ça éviterait le conflit dont tu parles avec un autre objet trop proche, non ?

Par Eliossar le 23/6/2002 à 13:47:16 (#1698887)

Oui en effet tu as raison.
Désolé ms j'ai commencé à utiliser le Toolset juste cette nuité donc je n'ai pas vu toutes les fonctions ou toutes les variables.
Merci talendil :merci:

Par Majca le 25/6/2002 à 1:24:02 (#1706605)

je dirais même plus ! ;)

Tu devrais utiliser ceci:


GetNearestCreature (CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC );



=> la chaise cherchera le joueur le plus proche


pour un pnj:


GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC);




Majca

Par W Lock-Strike le 26/6/2002 à 2:11:55 (#1712257)

Mon premier script (snif, je suis ému :p mais en fait il est plus de Jey et Hippias que de moi, vu mes lacunes :D)

Faire ouvrir une porte par un PNJ :


void main()
{
object oDoor ;
oDoor=GetNearestObjectByTag("Portehall") ;
if (GetIsOpen(oDoor)==0)
ActionOpenDoor(oDoor);
}



le tag de la porte est "Portehall" évidemment...
Le script est tout con, mais il permet un truc intéressant sans ajout de ligne dans le script, puisqu'il inclue le déplacement , peu importe où se trouve le PNJ : il suffit que le PNJ ait un path disponible pour atteindre la porte, pour qu'il y aille de lui même (sans avoir besoin d'utiliser MoveToObject ou MoveToLocation).

Donc associez le script dans l'onglet "taken actions" à une ligne de la conversation (par exemple , apres que le PJ ait dit "va m'ouvrir la porte" , le PNJ répond "ok" et on associe le script sur "taken action" à la réplique du PNJ, "ok")

Le PNJ court alors jusqu'a la porte , même si elle est a l'autre bout du module, et l'ouvre.


Ajout :
Vous pouvez aussi vérouiller la porte, et placer la clef associée à cette porte dans l'inventaire du PNJ. Sans rien ajouter au script, il pourra ouvrir la porte (car les clefs n'ont pas besoin d'être utilisées, il suffit qu'elles soient dans l'inventaire). Seul ce PNJ pourra alors ouvrir cette porte :)

(autrement dit si vous voulez entrer par effraction dans le QG LDD, il vous faudra obligatoirement passer sur le corps du portier auparavant :D)

Par Jey le 26/6/2002 à 2:23:11 (#1712276)

Oui enfin mon vieux, une autre version serait aussi de le débarasser de cette clé qui l'encombre... Lors d'une bousculade par exemple en courant, qui sait ce qui pourrait tomber de sa poche et attérir ds la main d'un habile pick-pockett? :roll:

Par W Lock-Strike le 26/6/2002 à 2:26:19 (#1712293)

Dommage, j'ai décoché "pickpocketable" :D

La revanche des objets

Par tonton le grognon le 26/6/2002 à 8:12:17 (#1712925)


//:://///////////////////// ////////////////////////
//:: FileName object_revenge
//:://///////////////////// ///////////////////////
//:://///////////////////// ///////////////////////
//:: Created By: Iskander of Plomar
//:: Created On: 6/21/2002 6:32:52 PM
//:://///////////////////// ///////////////////////
//
// un petit script qui detruit la personne qui detruit
// un objet....utilie pour les "briseurs de coffres"
#include "nw_i0_generic"
void main()
{
object oNaughtyOne = GetLastAttacker( OBJECT_SELF );
if ((OBJECT_INVALID == oNaughtyOne) && GetLastSpellHarmful()) {
oNaughtyOne = GetLastSpellCaster();
}
if (OBJECT_INVALID == oNaughtyOne) {
SpeakString("Hmmmm. You should watch what you're doing...");
return;
}
SpeakString("Fool! You would bite the hand that feeds you?");
ApplyEffectToObject( DURATION_TYPE_INSTANT,
EffectDamage( GetMaxHitPoints(oNaughtyOne), DAMAGE_TYPE_DIVINE),
oNaughtyOne,
0.0f);
}



a mettre dans les scripts "onPhysicallyAttacked" et "onSpellCastAt" de l'object

Par tonton le grognon le 26/6/2002 à 8:14:24 (#1712927)

des dizaines de scripts triés ICI : http://nwn.lyoness.com/files/scripting.htm

Par tonton le grognon le 26/6/2002 à 8:18:51 (#1712936)

script pour DM

http://nwn.lyoness.com/files/scripts/gives_dm_PC_info.txt

donne des infos sur un joueur quir entre dans le module
sa classe, ses caracteristiques, son materiels etc etc et l'imprime dans le logs du serveur

a coller dans le "on enter" de la premiere "area" ou arrivent les joueurs

PASSAGE SECRET sans besoin d'objets clickable

Par tonton le grognon le 26/6/2002 à 9:24:21 (#1713134)

et qui sera connu par le groupe entier sans besoin que chaque joueur le trouve (il fera apparaitre l'icone "passage" sur le triggers )

faire un trigger generic et dans sa partie script "on enter" mettre :


int secret_crypt_party_flag=0;
void main()
{
int difficulty = 20;
object oPlayer = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,1);
int search_score = GetSkillRank(SKILL_SEARCH, oPlayer);
if ( (d20(1)+search_score > difficulty)||GetLocalInt(GetModule(),"secret_crypt_party_flag") )
{
SetMapPinEnabled(GetObjectByTag("NW_SD_CRYPT",0),1);
SetLocalInt(GetModule(),"secret_crypt_party_flag",1);
ActionStartConversation(oPlayer,"crypt_sd",TRUE);
}
}


1) la 'difficulty' est le DC pour trouver la porte secret).
2) le oPlayer est la creature la plus proche (celle qui a marché sur le trigger)
3) search_score est le jet "de fouille/chercher"
4) le 'secret_crypt_party_flag' est utiliser pour donner la connaissance du passage aux autres membres du groupe.

5) le SetMapPin valide un Waypoint qui est coller dans l'area ou se trouve le trigger de la porte secrete.

le ActionStartConversation appelle un dialogue (qu'il faut nommer "crypt_sd") -> message d'intro "prendre la porte secrete?" (seule le joueur qui trouve le passage verra le dialogue)
il faut faire 2 choix dans le dialogue:
1. le prendre
2. ne pas le prendre

si le joueur choisit de "le prendre"
le script suivant est appelé : (dans la partie script "action taken" du choix "le prendre")

void main()
{
object oPlayer = GetPCSpeaker();
object oTargetArea = GetObjectByTag("NW_CRYPT_START",0);
AssignCommand(oPlayer,ActionJumpToLocation(GetLocation(oTargetArea)));
}


le resultat est une teleportation du joueur qui dialogue au waypoint dans dont le tag est NW_CRYPT_START

scipt by zug sur forum bioware (téste & marche)

Monstre errant pendant le repos des joueurs

Par tonton le grognon le 26/6/2002 à 10:59:13 (#1713616)

http://nwvault.ign.com/Files/scripts/data/monster_restmindtakerrCreature%20Related.shtml

le script est à coller dans le module OnPlayerRest action..

provoque l'apparition d'un monstre 33% du temps ou un aventurier se repose :D

Une taverne animée

Par Shelzard le 27/6/2002 à 3:29:50 (#1717278)

Voici un petit script qui permet d'avoir une taverne vivante, ce script n'est pas de moi, mais je l'ai modifié pour le rendre plus complet avec des NPC assis, des textes en FR et des raleries monologue des serveuses.

Il faut avoir : une taverne :)
5+ de NPC qui servent de clients
même nombre de chaises que de clients
une ou plusieurs serveuses

Ensuite, à vos NPC, donnez comme tag : Client
Le meme tag pour tous les clients.
Aux chaises, donnez le tag ChaiseClient (pour éviter de les utiliser avec le script pour s'assoir) et rendez les "usable".
Placez vos clients près des chaises.

Ensuite, aux serveuses, modifiez le script par défaut NW_C2_DEFAULT9 qui se trouve dans le OnSpawn des serveuses, et enlevez les // qui rendent les lignes en commentaire pour ces lignes ci :
SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);
SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);

Ensuite, mettez ce script dans OnUserDefined :

void main()
{
object oTarget;
oTarget = GetNearestObjectByTag("Client", OBJECT_SELF, Random(7)); // mettez le chiffre du Random egal au nombre de clients
if (!(oTarget == OBJECT_INVALID))
{
int iRandom = Random(6); // ce random la est utilise pour les phrases ci-dessous, a regler donc si vous retirez ou ajoutez des phrases
ClearAllActions();
if (iRandom == 1)
{
AssignCommand(oTarget, SpeakString("J'ai faim !"));
ActionSpeakString("Voila voila, j'arrive...");
}
else if (iRandom == 2)
{
AssignCommand(oTarget, SpeakString("Ma biere se vide trop vite!"));
ActionSpeakString("laissez moi vous resservir!");
}
else if (iRandom == 3)
{
AssignCommand(oTarget, SpeakString("Pourrai-je etre servi?"));
ActionSpeakString("Certainement, une seconde!");
}
else if (iRandom == 4)
{
AssignCommand(oTarget, SpeakString("Vous avez du pain?"));
ActionSpeakString("oui voila!");
}
else if (iRandom == 5)
{ // disparition du AssignCommand, histoire de faire raler la serveuse
ActionSpeakString("ce que je peux avoir mal aux pieds!");
}
else if (iRandom == 6)
{
ActionSpeakString("vivement qu'on ferme...");
}
ActionMoveToObject(oTarget);
}
}


**************************
Maintenant, au tour des Clients et de les faire assoir gentiment :)
Mettre ce script dans le OnSpawn :

#include "NW_I0_GENERIC"
void main()
{
object oChaise;
int nChaise = 1;
oChaise = GetNearestObjectByTag("ChaiseClient", OBJECT_SELF, nChaise);
ClearAllActions();
ActionSit(oChaise);
}


Vous pouvez aussi le mettre dans le OnHeartBeat si vous désirez voir votre NPC s'assoir. Si vous désirez qu'ils soient assis quand vous entrez dans la Zone, mettez le alors dans le OnSpawn.

Le résultat est très sympa, vous voyez votre/vos serveuse se ballader dans la taverne pour servir les clients qui sont assis et qui râlent :)

Shelzard

Allez directement en Prison, ne passez pas par la case départ

Par Shelzard le 27/6/2002 à 3:40:44 (#1717299)

Voici un petit script anti-tueur de NPC :)
Mieux que de rendre les NPC invincible, mieux que les summons de guardes, mieux que l'instakill du PC qui attaque le NPC.

La Prison ! :)
le but de ce script, est de téléporter le PC attaquant dans une Zone (et de préférence une prison).

Mettez le script suivant dans OnDamaged :

#include "NW_I0_GENERIC"

void main()
{
if(!GetFleeToExit())
{
if(!GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
{
if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()))
{
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
{
DetermineSpecialBehavior(GetLastDamager());
}
else if(GetIsObjectValid(GetLastDamager()))
{
DetermineCombatRound();
if(!GetIsFighting(OBJECT_SELF))
{
object oTarget = GetLastDamager();
if(!GetObjectSeen(oTarget) && GetArea(OBJECT_SELF) == GetArea(oTarget))
{
ActionMoveToLocation(GetLocation(oTarget), TRUE);
ActionDoCommand(DetermineCombatRound());
}
}
}
}
else if (!GetIsObjectValid(GetAttemptedSpellTarget()))
{
object oTarget = GetAttackTarget();
object oAttacker = GetLastHostileActor();
if (GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&
(GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||
(GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
{
DetermineCombatRound(oAttacker);
}
}
}
}
if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(1006));
}
}

object oPC = GetLastAttacker();
if (GetIsPC(oPlayer))
{
SpeakString ("Allez hop, en taule !");
object oTarget = GetWaypointByTag ("wp_taule1");
int iRandom = Random(4);
if (iRandom==1)
{
object oTarget = GetWaypointByTag ("wp_taule1");
}
else if (iRandom==2)
{
object oTarget = GetWaypointByTag ("wp_taule2");
}
else if (iRandom==3)
{
object oTarget = GetWaypointByTag ("wp_taule3");
} else {
object oTarget = GetWaypointByTag ("wp_taule4");
}
DelayCommand(5.0, AssignCommand( oPC, JumpToObject( oTarget)));
}
}


C'est le script par défaut de OnDamaged avec la fin mon script de téléportation en prison.
Le random sert uniquement si vous utilisez plusieurs prison (mon but étant de ne jamais savoir où on attérit, ce qui rend difficile son évasion).
Ensuite, débrouillez-vous pour faire une belle prison bien gardée où seule les autres PC pourront aider le pauvre prisonnier.

Je bosse sur une autre version, où le prisonnier se retrouve dépouiller de tout son matos en arrivant en taule. Et en changeant le 'bind' de recall à sa prison.

Shelzard

Avoir l'heure avec les cadrans solaires

Par Shelzard le 27/6/2002 à 3:48:25 (#1717314)

Créez un Sundial, rendez le Usable, et mettez ce script dans OnUsed.
Le but, est de savoir l'heure grâce au soleil, évidemment, le cadran ne marche que le jour.


void main()
{
int nHeure = GetTimeHour();
if (GetIsNight()) {
SpeakString("Vous ne pouvez pas utiliser ceci la nuit.");
} else if (nHour 12) {
SpeakString("Il est " + (IntToString(nHeure)) + "h00");
} else {
SpeakString("Il est midi");
}
}


Script inspiré d'un script existant chez Bioware.

Shelzard

Statue Juke Box

Par Shelzard le 27/6/2002 à 4:36:58 (#1717380)

Voilà un script qui sert à rien :)
Transformer une statue en JukeBox, enfin, pas vraiment, car je n'ai pas trouvé le moyen de jouer différentes musique que celle de la Zone. Donc, ça joue des sons.

Voici le script à mettre dans OnUsed de la statue, bien sur, il faut rendre la statue 'useable'. Evitez les gargoyles, à moins de retirer le script du HeartBeat, vous aurez une mauvaise surprise :)

void main()
{
object oPC = GetLastUsedBy();
object oStatue = OBJECT_SELF;
int iRand = Random (6);
if (iRand==1)
{
AssignCommand( oStatue, PlaySound("as_an_orcgrunt1"));
}
else if (iRand==2)
{
AssignCommand( oStatue, PlaySound("as_an_owlhoot1"));
}
else if (iRand==3)
{
AssignCommand( oStatue, PlaySound("as_an_pigeon1"));
}
else if (iRand==4)
{
AssignCommand( oStatue, PlaySound("as_an_songbirds1"));
}
else if (iRand==5)
{
AssignCommand( oStatue, PlaySound("as_an_crows1"));
}
else
{
AssignCommand( oStatue, PlaySound("as_an_dogbark1"));
}
}


Voilà, vous changez le nombre du Random si vous ajoutez des sons et faites les conditions else if qui s'impose.
Script très bidon, n'est-il pas ? mais ça m'éclate :)

Shelzard

Des XP variables selon la difficulté pour desarmer un piege

Par tonton le grognon le 27/6/2002 à 7:36:03 (#1717563)

void main()
{
// declare variables being used
// nExp as integer for value of XP being assigned
int nExp;
// oPC is the creature object who disarmed the trap
object oPC = GetLastDisarmed();
// nTrapDC is the trap DC integer
int nTrapDC = GetTrapDisarmDC(GetObjectByTag("TRAP_TAG_HERE"));
// declare value of nExp based on the trap's DC
if (nTrapDC 25) && (nTrapDC 30) && (nTrapDC < 36))
nExp = 300;
else nExp = 400;
// once nExp is set, give that amount in XP to the PC
GiveXPToCreature(oPC, nExp);
}


A mettre dans l'evenement "OnDisarm" du piege
(c) dagid gaider



et un autre : pour les traps sur le "ondisarm"

//Disarm Trap XP award for Thieves
//Operates on this math: (TrapDC * XPMultiplier) - (ThiefLevel x Skill) = XP Award
// Created by Todmaerin 6/22/02
// Modified 6/30/02

object oThief = GetLastDisarmed();
void main()
{
string sThiefLevel;
int nPosition;
int nRogueTrue;
for (nPosition= 1; nPosition <= 3; nPosition ++)
{
nRogueTrue = GetLocalInt(oThief, IntToString(GetClassByPosition (nPosition, oThief) ));
};
if (nRogueTrue = CLASS_TYPE_ROGUE)
{
sThiefLevel = IntToString(GetLevelByClass (CLASS_TYPE_ROGUE, oThief));
int nDisarmSkill = GetSkillRank(SKILL_DISABLE_TRAP, oThief);
int nTrapDC = GetTrapDisarmDC(OBJECT_SELF);
float fXPMod = 1.2;
//the math
int nXPAward = FloatToInt((nTrapDC * fXPMod) - (StringToInt(sThiefLevel) * nDisarmSkill));
GiveXPToCreature (oThief, nXPAward);
}

}


et pour les locks sur le onlock


//Unlock XP award for Thieves
//Operates on this math: (UnlockDC * XPMultiplier) - (ThiefLevel x Skill) = XP Award
//
// Created by Todmaerin 6/22/02
// Modified 6/30/02
object oThief = GetLastUnlocked();
void main()
{
string sThiefLevel;
int nPosition;
int nRogueTrue;
for (nPosition = 1; nPosition <= 3; nPosition ++)
{
nRogueTrue = GetLocalInt(oThief, IntToString (GetClassByPosition (nPosition, oThief) ));
};
if (nRogueTrue = CLASS_TYPE_ROGUE)
{
sThiefLevel = IntToString(GetLevelByClass (CLASS_TYPE_ROGUE, oThief) );
int nUnlockSkill = GetSkillRank(SKILL_OPEN_LOCK, oThief);
int nLockDC = GetLockUnlockDC(OBJECT_SELF);
float fXPMod = 1.2;
//the math
int nXPAward = FloatToInt((nLockDC * fXPMod) - (StringToInt(sThiefLevel) * nUnlockSkill) );
GiveXPToCreature( oThief, nXPAward);
}

}

Mort facon regles DD officiel

Par tonton le grognon le 28/6/2002 à 8:15:24 (#1723106)

http://nwn.bioware.com/forums/viewcodepost.html?post=675586

à coller sur le script On Dying creé par EtherDragon, Jun 27, 2002.

Le joueur commence par tomber inconscient à 0 point de vie,
puis perd 1 pts de vie par round en appelant à l'aide
et il meurt quand il atteint -10

les NPC et monstres arretent de l'attaquer quand il est inconscient.

Par tonton le grognon le 28/6/2002 à 8:18:37 (#1723110)

Un autre endroit ou il existe de superbes scripts aussi.. dont un systeme de banque "a la mmorpg"

http://web469.can05.de/modules.php?name=Downloads&d_op=viewdownload&cid=2&orderby=dateD

Par ZeDuckMaster le 29/6/2002 à 0:48:54 (#1727804)

dans le genre :
script pour qu'un joueur s'asseye sur un objet lorsqu'il clique dessus .....

void main()
{
object oChair = OBJECT_SELF;
AssignCommand(GetLastUsedBy(),ActionSit(oChair));
}


le script est bien evidemment a placer dans le OnUsed

-> pas de tags predefinis, donc peut etre appliqué a n'importe quel objet tel quel sous la forme d'un seul script unique (quoique s'asseoir sur une table ou sur une armoire ca fait pas top top ;) )


remarque : le fait de créer un objet temporaire (oChair) semble etre necessaire puisque la fonction AssignCommand prend un object en parametre et que la constante OBJECT_SELF seule ne marche pas (c'est un int je penses ...), le compilateur doit alors la transformer en objet valide dans le cas d'un assignement.

Par ZeDuckMaster le 29/6/2002 à 14:55:54 (#1729914)

les waypoints :
comme beaucoup d'entre vous on du le remarquer, lorsqu'un pnj (ou un monstre) parcourt les waypoints, celui ci le fait dans un sens (du waypoint 1 au n) puis dans l'autre (du waypoint n au 1) mais sans jamais boucler.

Pour remedier a ce probleme, il suffit d'ouvrir le fichier de script "nw_i0_generic" et d'aller dans la fonction "RunCircuit" et tout simplement d'enlever les lignes suivantes :


// once there are no more waypoints available, decriment back to the last
// valid point.
nNum--;
if (nNum < 0)
{
nTens--;
nNum = 9;
}

// start the cycle again going back to point 01
oTargetPoint = GetWaypointByTag(sWay + GetTag(OBJECT_SELF) + "_" + IntToString(nTens) +IntToString(nNum));
while(GetIsObjectValid(oTargetPoint))
{
ActionWait(fPause);
ActionMoveToObject(oTargetPoint, nRun);
nNum--;
if (nNum mes travaux ->nwn scripts

pour l'utiliser il suffit de l'inclure dans vos scripts.

cool

Par yenal le 1/7/2002 à 18:29:18 (#1740467)

bon bah c super g testé la plus part de vos scripts ki sont bien cool mais g un chti probleme avec le 1er ( levier )...

En effet malgré que usable soit coché, mon personnage se presente devant le levier et est incapable de l'utilisé...

thx d'avance

Protection d'un coffre

Par judgeju le 3/7/2002 à 20:50:13 (#1752964)

Un petit script à mettre dans le OnDisturbed d'un objet style Coffre, Armoire... Son proprio réagira si un PJ tente d'y prendre quelque chose.


void main()
{
object oCoffre = OBJECT_SELF;
object oJoueur = GetLastDisturbed();
object oProprio = GetNearestObjectByTag("TAG_DU_PROPRIO");//Indiquer le tag du propri
//On peut aussi faire: object oProprio = GetNearestCreature (CREATURE_TYPE_IS_ALIVE,TRUE); pour avoir un script non générique.
// Jet de pickpocket du joueur.
int iPPSkillCheck = d20(1) + 1 + GetSkillRank(SKILL_PICK_POCKET, oJoueur);
// Jet de reperer du marchand.
int iSpotCheck = d20(1) + 3 + GetSkillRank(SKILL_SPOT, oProprio);
// Affichage du résultat du jet.
string sSkillCheck = "Pickpocket " + IntToString(iPPSkillCheck) + " vs Reperer " + IntToString(iSpotCheck);
if (iPPSkillCheck > iSpotCheck)
{
// Personne ne remarque le vol.
FloatingTextStringOnCreature(sSkillCheck + " - Personne n'a remarque votre chapardage...", oJoueur);
// Legere baisse de la reputation du joueur. La ou il passe, les objets disparaissent...
AdjustReputation(oJoueur, oProprio, -5);
return;
}
else
{
// Vol remarque!
FloatingTextStringOnCreature(sSkillCheck + " - Oups, on vous a vu!", oJoueur);
// Grosse baisse de la reputation
AdjustReputation(oJoueur, oProprio, -20);
//Premiere fois avertissement...
if(GetLocalInt(OBJECT_SELF,"Reac_Marchand") == 0)
{
AssignCommand(oProprio,ActionMoveToObject(oCoffre,TRUE));
AssignCommand(oProprio,ActionSpeakString("He la! Que je ne vous y reprenne pas!"));
SetLocalInt(OBJECT_SELF,"Reac_Marchand",1);
}
else
{
//Deuxieme fois attaque...
AssignCommand(oProprio,ActionEquipMostDamagingMelee());
AssignCommand(oProprio, ActionAttack(oJoueur));
}
}
}


Merci à ZeDuckMaster sans qui rien n'aurait été possible. Une amélioration possible: Que le PJ doive rendre l'objet qu'il vient juste de prendre... Un autre jour peut-être. :)

Système conversation par mot-clef

Par Machin le 6/7/2002 à 3:50:35 (#1766155)

http://forums.jeuxonline.info/showthread.php?s=&threadid=101559

Script de debug

Par Gargantuel le 6/7/2002 à 10:55:37 (#1766720)

http://forums.jeuxonline.info/showthread.php?s=&threadid=101586

Par Dielsa le 6/7/2002 à 11:10:34 (#1766769)

Des xp variables pr désamorcer le piège, a mettre ds le OnDisarm du piège.
****************************************************
void main()
{
// declare variables being used
// nExp as integer for value of XP being assigned
int nExp;
// oPC is the creature object who disarmed the trap
object oPC = GetLastDisarmed();
// nTrapDC is the trap DC integer
int nTrapDC = GetTrapDisarmDC(GetObjectByTag("TRAP_TAG_HERE"));
// declare value of nExp based on the trap's DC
if (nTrapDC 25) && (nTrapDC 30) && (nTrapDC < 36))
nExp = 300;
else nExp = 400;
// once nExp is set, give that amount in XP to the PC
GiveXPToCreature(oPC, nExp);
}
****************************************************

Par Dielsa le 6/7/2002 à 11:11:47 (#1766774)

Des xp variables pour les locks ds le OnLock
**********************************************************************************
//Unlock XP award for Thieves
//Operates on this math: (UnlockDC * XPMultiplier) - (ThiefLevel x Skill) = XP Award
//
// Created by Todmaerin 6/22/02
// Modified 6/30/02
object oThief = GetLastUnlocked();
void main()
{
string sThiefLevel;
int nPosition;
int nRogueTrue;
for (nPosition = 1; nPosition <= 3; nPosition ++)
{
nRogueTrue = GetLocalInt(oThief, IntToString (GetClassByPosition (nPosition, oThief) ));
};
if (nRogueTrue = CLASS_TYPE_ROGUE)
{
sThiefLevel = IntToString(GetLevelByClass (CLASS_TYPE_ROGUE, oThief) );
int nUnlockSkill = GetSkillRank(SKILL_OPEN_LOCK, oThief);
int nLockDC = GetLockUnlockDC(OBJECT_SELF);
float fXPMod = 1.2;
//the math
int nXPAward = FloatToInt((nLockDC * fXPMod) - (StringToInt(sThiefLevel) * nUnlockSkill) );
GiveXPToCreature( oThief, nXPAward);
}

}
***********************************************************************************

Script de bûcheron bûcheronnant

Par Cassin le 8/7/2002 à 10:28:11 (#1775272)

Cet exemple s'applique à un PNJ pour qu'il "attaque" un arbre pour donner l'illusion qu'il le coupe, mais avec quelques modifs on peut appliquer ce qu'on veut comme effet.
Le but étant que le bûcheron arrête son boulot quand le joueur approche, afin de pouvoir lui parler, et qu'il recommence à couper l'arbre après son départ.

D'abord, créer un PNJ, si possible avec une hache :D.
Pour un bô narbre, j'ai pris le tileset forest et comme les arbres sont des tiles qu'on ne peut pas "tagger", j'ai posé dessus un "InvisibleObject" que le bûcheron attaquera.

Autour du PNJ, créer un trigger qui délimitera la zone dans laquelle le joueur pénétrera et arrêtera en même temps le boulot du bûcheron.


Voilà les scripts à mettre :

Sur le Trigger :
- dans OnEnter :


void main()
{
object oPC;
oPC=GetEnteringObject();
SetLocalInt(oPC,"InZone",1);
}


- Dans OnExit :

void main()
{
object oPC;
oPC = GetExitingObject();
SetLocalInt(oPC,"InZone",0);
}




Sur le PNJ :
Dans OnPerception :

void main()
{
if(GetIsPC(GetLastPerceived()))
{
SignalEvent(OBJECT_SELF,EventUserDefined(200));
}
}


- Dans OnUserDefined :

void main()
{
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC );
switch(GetUserDefinedEventNumber())
{
case 200:
{
if(!IsInConversation(OBJECT_SELF) && GetLocalInt(oPC,"InZone") == 0)
{
ActionAttack(GetNearestObjectByTag("InvisibleObject"));
DelayCommand(12.0,ClearAllActions());
DelayCommand(24.0,SignalEvent(OBJECT_SELF,EventUserDefined(200)));
}
else
{
DelayCommand(12.0,SignalEvent(OBJECT_SELF,EventUserDefined(200)));
}
}
}
}



Voilà !

EDIT : il est à noter qu'on ne peut pas parler au PNJ tant qu'il ne s'est pas mit en "mode repos" (dans mon cas, il repose sa hache sur son épaule). Si le PNJ renvoie la phrase "object is busy", il suffit d'attendre un peu que son attitude ou sa posture change pour pouvoir lui parler.

Par Adalorn le 9/7/2002 à 12:35:47 (#1780630)

un ti script pour simuler la biblio d'un mage, à placer dans OnOpen
(il faut créer des blueprint des parchemins de 1 à 10)


void main()
{
object oPlayer = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,OBJECT_SELF,1);
int search_score = GetSkillRank(SKILL_SEARCH, oPlayer);
string parchemin = "parchemin" + IntToString(d10(1));
int dif = 22;
if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0)
{
dif += 5;
}
SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",1);
ApplyEffectToObject (DURATION_TYPE_TEMPORARY, EffectParalyze(), oPlayer, 3.0);
if (d20(1)+ search_score > dif)
{
AssignCommand(oPlayer, SpeakString("eh! j'ai trouve un parchemin entre deux livres!"));
ActionGiveItem ( GetObjectByTag ( parchemin, 0 ), oPlayer );
}
}

Re: Une taverne animée

Par kaliyouga le 10/7/2002 à 0:13:12 (#1783917)

Provient du message de Shelzard
Voici un petit script qui permet d'avoir une taverne vivante, ce script n'est pas de moi, mais je l'ai modifié pour le rendre plus complet avec des NPC assis, des textes en FR et des raleries monologue des serveuses.

Il faut avoir : une taverne :)
5+ de NPC qui servent de clients
même nombre de chaises que de clients
une ou plusieurs serveuses

Ensuite, à vos NPC, donnez comme tag : Client
Le meme tag pour tous les clients.
Aux chaises, donnez le tag ChaiseClient (pour éviter de les utiliser avec le script pour s'assoir) et rendez les "usable".
Placez vos clients près des chaises.

Ensuite, aux serveuses, modifiez le script par défaut NW_C2_DEFAULT9 qui se trouve dans le OnSpawn des serveuses, et enlevez les // qui rendent les lignes en commentaire pour ces lignes ci :
SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);
SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);

Ensuite, mettez ce script dans OnUserDefined :

void main()
{
object oTarget;
oTarget = GetNearestObjectByTag("Client", OBJECT_SELF, Random(7)); // mettez le chiffre du Random egal au nombre de clients
if (!(oTarget == OBJECT_INVALID))
{
int iRandom = Random(6); // ce random la est utilise pour les phrases ci-dessous, a regler donc si vous retirez ou ajoutez des phrases
ClearAllActions();
if (iRandom == 1)
{
AssignCommand(oTarget, SpeakString("J'ai faim !"));
ActionSpeakString("Voila voila, j'arrive...");
}
else if (iRandom == 2)
{
AssignCommand(oTarget, SpeakString("Ma biere se vide trop vite!"));
ActionSpeakString("laissez moi vous resservir!");
}
else if (iRandom == 3)
{
AssignCommand(oTarget, SpeakString("Pourrai-je etre servi?"));
ActionSpeakString("Certainement, une seconde!");
}
else if (iRandom == 4)
{
AssignCommand(oTarget, SpeakString("Vous avez du pain?"));
ActionSpeakString("oui voila!");
}
else if (iRandom == 5)
{ // disparition du AssignCommand, histoire de faire raler la serveuse
ActionSpeakString("ce que je peux avoir mal aux pieds!");
}
else if (iRandom == 6)
{
ActionSpeakString("vivement qu'on ferme...");
}
ActionMoveToObject(oTarget);
}
}


**************************
Maintenant, au tour des Clients et de les faire assoir gentiment :)
Mettre ce script dans le OnSpawn :

#include "NW_I0_GENERIC"
void main()
{
object oChaise;
int nChaise = 1;
oChaise = GetNearestObjectByTag("ChaiseClient", OBJECT_SELF, nChaise);
ClearAllActions();
ActionSit(oChaise);
}


Vous pouvez aussi le mettre dans le OnHeartBeat si vous désirez voir votre NPC s'assoir. Si vous désirez qu'ils soient assis quand vous entrez dans la Zone, mettez le alors dans le OnSpawn.

Le résultat est très sympa, vous voyez votre/vos serveuse se ballader dans la taverne pour servir les clients qui sont assis et qui râlent :)

Shelzard


Euh... Ton script est vraiment génial, MAIS... :aide: (oui je suis une quiche) il me fé planter mon module :p ... Quand j'ouvre mon module dans NWN, IL se ferme (NWN) au bout de quelques minutes, sans prevenir. Il n'y avait pas ce problème avant.
Je dis ca juste pour savoir si la meme chose était arrivée a d'autres, ou si je suis une gourde de quiche qui s'est encore planté kek part.

woila.

:D

Par MTorment le 10/7/2002 à 1:22:56 (#1784138)

J'ai autre un problème Shelzard pour l'auberge, c'est que les serveuses ne font rien. Pourtant j'ai fait comme tu as dit, j'ai copié-collé, les scripts sont bon mais les serveuses bougent pas.
Voilà:) , où se trouve le problème?

Par Kray le 10/7/2002 à 8:38:51 (#1784830)

Script de replissage d'un contenant chaque X seconde (pour univers permanent)

Sur OnOpen du contenant:

//::///////////////////////////////////////////////
//:: Remplissage aléatoire d'un contenant
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Se place sur OnOpen d'un contenant.
Remplit le contenant d'un trésor,
chaque X seconde(s). Pour regler
le temps de respawn, modifier la valeur de
la variable float fRespawnTime.
Pour regler la valeur du trésor, modifier la
fonction de génération (par défaut à
GenerateLowTreasure) par :
Trésor de basse valeur :
GenerateLowTreasure
Trésor de valeur moyenne :
GenerateMediumTreasure
Trésor de haute valeur :
GenerateHighTreasure
Trésor de boss :
GenerateBossTreasure
Livre aléatoire :
GenerateBookTreasure
*/
//:://////////////////////////////////////////////
//:: Created By: Kray
//:: Created On: 10/07/2002 08:29
//:://////////////////////////////////////////////
#include "NW_O2_CONINCLUDE"

void main()
{
//Par défaut, à 30min de respawn.
float fRespawnTime = 1800.0;
object oPC = GetLastOpener();
if(GetIsPC(oPC))
{
if(GetLocalInt(OBJECT_SELF,"EMPTY") == 0)
{
GenerateLowTreasure(oPC,OBJECT_SELF);
SetLocalInt(OBJECT_SELF,"EMPTY",1);
DelayCommand(fRespawnTime,SetLocalInt(OBJECT_SELF,"EMPTY",0));
}
else
{
SendMessageToPC(oPC,"Cet objet est vide!");
}
}
}
:)

taverne animée

Par BALLESTO le 10/7/2002 à 8:49:30 (#1784854)

bonjours a tous.

Pour le script de la taverne animée, moi je n'est pas eu de problème, mais il me ralenti considérablement le module.

J'ai copier-coller le script dans le onheart des serveuses ( j'ai est deux ) et j'ai mis le tag "client" ( à six clients ).

A oui légére modif au début du script j'ai collé un clearallaction comme conseillé dans les cours de script du forum.

Comme quoi ça sert les cours de script du forum, merci Amaranthe.:D

Par Kray le 10/7/2002 à 8:51:53 (#1784857)

OnHeartBeam effectue une action chaque 6 secondes, et vraiment, c'est très lourd pour le serveur. Largement déconseillé. Utilise plutot, comme préconisé dans le script de la taverne animée, OnUserDefined et OnSpawn.

Par izuall le 10/7/2002 à 9:28:15 (#1784949)

Didoo :

Bon voilà un script (programmé à la Didoo ) qui se place sur une porte et qui ne permet de changer de zone que si la party à l'objet voulut, c à mettre sur OnAeraTransitionClick : (bon vé mettre des commentaires qd mm )

//Bon le include c pour que l'éditeur remplace cette ligne par un fichier de nwn existant, c pour utiliser CheckPartyForItem plus tard

#include "nw_i0_tool"

void main()
{

//Bon là on définit qui a cliquer sur l'objet
object oClicker = GetClickingObject();

/*la c pour définir l'objet du chgt d'aera (de base dans OnAeraTransitionClick*/
object oTarget = GetTransitionTarget(OBJECT_SELF);

//définition d'un waypoint appelé par son tag
object way_repousse = GetNearestObjectByTag("waypoint_repousse");

/*def de la location de la zone dans laquelle va la porte*/
location lLoc = GetLocation(oTarget);

/*Si l'objet Lettre_Reine n'est pas dans l'inventaire de la partie (vous pourrez faire dans l'inventaire d'un seul joueur aussi)
Alors on marque un texte et on fait bouger de force le joueur au waypoint. On peut aussi juste le faire MoveAwayFromObject si vous préférez*/

if(!CheckPartyForItem(oClicker,"Lettre_Reine"))
{
ActionSpeakString("Une force invisible vous repousse");
AssignCommand(oClicker,ActionForceMoveToObject(way_repousse));
}
else
{
/*Sinon, si il a l'objet, il peut changer de zone*/
AssignCommand(oClicker,JumpToLocation(lLoc));
}
}

Par mobidique le 10/7/2002 à 11:36:58 (#1785525)

Je voulais une trap door qui s'ouvre laisse le PJ passer dans la zone suivante et se referme (parce qu'une trap door ouverte c'est dangereux quelqu'un pourrait tomber ;) ... Alors j'en suis là :

void main()
{
object oPC = GetLastUsedBy();
object oTarget = GetWaypointByTag("WP_CaveToAuberge");

PlayAnimation(ANIMATION_PLACEABLE_OPEN);
DelayCommand(1.0, AssignCommand( oPC, JumpToObject( oTarget)));
DelayCommand(2.0, PlayAnimation(ANIMATION_PLACEABLE_CLOSE));
}


L'étape suivante pourrait consister à augmenter le temps pendant la quelle la trap est ouverte et utiliser la variable locale trap_door_open pour dinstinguer les cas où la trappe est fermée lors de son utilisation et donc doit être ouverte, des cas où la trappe est ouverte qui alors ne nécessite pas son ouverture. Je pense que l'on peut utiliser ActionCloseDoor et ActionOpenDoor sur OBJECT_SELF.

A mettre sur OnUsed de la trap door.

Mob'.

PS : pour des recherches ultérieures j'ajoute les mots trapdoor et trappe et transition, puisque transition il y a ;).

EDIT : plus fort : le script générique
void main()
{
object oPC = GetLastUsedBy();
object oTarget = GetWaypointByTag("WP_" + GetTag(OBJECT_SELF));

PlayAnimation(ANIMATION_PLACEABLE_OPEN);
DelayCommand(1.0, AssignCommand( oPC, JumpToObject( oTarget)));
DelayCommand(2.0, PlayAnimation(ANIMATION_PLACEABLE_CLOSE));
}

comme on le voit je vais chercher le tag de la trappe qui sera le nom du waypoint. C'est pas trés contraignant, je trouve, de faire une trappe AubrgeToCave liée au waypoint WP_AubergeToCave.

Par kaliyouga le 10/7/2002 à 13:10:06 (#1786010)

Provient du message de MTorment
J'ai autre un problème Shelzard pour l'auberge, c'est que les serveuses ne font rien. Pourtant j'ai fait comme tu as dit, j'ai copié-collé, les scripts sont bon mais les serveuses bougent pas.
Voilà:) , où se trouve le problème?


c tout simple. au lieu de rajouter ca :

SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);
SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);

tu fé ca:

SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);
SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);
}

woila.
:o)

moi ca marche, mé ca m'fé planter mon module ^^

Par Skanzo Sylan le 13/7/2002 à 1:37:42 (#1799143)

Me suis amuser à bidouiller le script du sundial pour qu'il affiche les minutes aussi. Oui d'accord, je sais, c'est une horloge solaire astronomique hyper précise...
Hum? Sisi c'est très RP comme explication :p

Enfin bon, ça affiche les heures et les minutes exactement comme vous l'avez configuré dans vot'module, pô besoin de préciser n'importe quelle variable, ça marche tout seul ou presque :)

Heu... ha oui, je l'avoue je suis une quiche donc si vous trouvez le script un peu bordélique... c'est normaaaal (voix de l'ange au paradis des nains pour ceux qui connaissent :p).

void main()
{
string sMinute;
int nMinByeHour = FloatToInt(HoursToSeconds(1)) / 60;
int nHeure = GetTimeHour();
int nMinute = (60 / nMinByeHour) * GetTimeMinute();
int nSecond = GetTimeSecond();

nMinute = nMinute + nSecond / nMinByeHour;

if (nMinute < 10) {
sMinute = "0" + IntToString(nMinute);
}
else {
sMinute = IntToString(nMinute);
}

ActionSpeakString("Il est " + IntToString(nHeure) + "h" + sMinute);

}

Par Einkil le 14/7/2002 à 17:01:57 (#1804301)

Il est très chouette ton script pour le cadran solaire, mais j'ai remarqué un ptit problème. Je clique une fois dessus, j'ai l'heure a la minute près, je reclique une deuxieme fois et ca a avancer d'une minute, une 3 eme fois et c'est pareil. Bref, un clique le fais avancer d'une minute chaque fois. Comment régler ce probleme?

Un autre script de barmaid.

Par [xkill]sniper! le 15/7/2002 à 22:49:04 (#1810504)

Bonjour,
Voici un autre script de Barmaid qui ne fonctionne pas trop mal.
Il est basé sur un script posté sur http://nwn.lyoness.com/files/scripts/barmaidscript2.txt
Je travaille encore à son amélioration. En fait, à la base c'était aussi un exercice de "scripting" pour découvrir les subtilités de ce beau langage.....

Tout d'abord, vous creez une Taverne. Puis vous y placez une serveuse (ou un serveur !). Vous modifiez le script OnSpanw pour déclencher le HeartBeat (1001) et Conversation(1004)
Vous placez des chaises que vous nommez "Chair" (ou autrement si vous le souhaitez, mais il faudra modifier le script à un endroit.

Ensuite, vous placez ce script dans le UserDefined de la serveuse.
Vous noterez que les commentaires sont en anglais ! Au début je voulais aussi le poster sur un forum en anglais !

Quelques explications :
Ce script s'éxécute par morceaux. (au rythme des Heartbeat). Si l'éxécution de l'état est un peu longue, j'ajoute un break en fin de case ( le but est d'attendre le prochain heartbeat pour effectuer la suite, d'où le besoin de conserver le contexte)

à chaque état, il sauvegarde son contexte dans des variables locales SetLocalxxxx(...);
à chaque entrée, il relit son état pour continuer la où il s'était arrêté au Heartbeat précédent.
On peut "tuner" le système en regroupant plus ou moins des actions au sein d'une étape. En fait, j'ai l'impression que cela dépend de la taille de la taverne. Si le trajet de la barmaid est long, elle semblera active en permanance, si la piece est petite, les 6 secondes entre chaque Hearbeat vous donneront l'impression qu'elle ne fait rien ! (dans ce cas, regroupez des états)

Comme l'indique le commentaire ci-dessous
La serveuse cherche un client (nème NPC le plus proche)
Vérifie qu'il ne s'agit pas d'un "Barkeeper" (ça marche sans lui ! :-) )
Se déplace vers le client.
Lui demande ce qu'il souhaite consommer (vous pouvez customiser les répliques dans la fonction usr_Rndspeak( int type );
Le client s'assoie (à améliorer !), réponds
La serveuse retourne au bar passer la commande,
Elle revient servir,
Le client remercie


THEORIQUEMENT IL DEVRAIT QUITTER SA CHAISE , MAIS CA MARCHE PAS !!!
Si qqn sait pourquoi ... :-)
c'est la ligne dans le case 7:

AssignCommand( oCustomer ,ActionMoveAwayFromObject(oNearestChair , FALSE , 3.0f) );


Vous pouvez aussi ajouter des répliques pour chaque catégorie de Question/Réponse. (il suffit de changer le random de chaque type de question réponse) et d'ajouter des case ...

Toute remarque ou modification est la bienvenue.

[ le 17/7 : Améliorations apportées au code. En fait, en lisant une très bonne FAQ, j'ai compris ce qui cloche ....
Quand je tape

AssignCommand( oCustomer ,ActionSit( oNearestChair ) );
ActionSpeakString(usr_Rndspeak(1)) ;
// immediatly stores the answer
CustAnswer =usr_Rndspeak(2);
SetLocalString(OBJECT_SELF , "CUSTANSW" ,CustAnswer);
AssignCommand( oCustomer ,SpeakString(CustAnswer) );

J'ai l'impression de séquencer la réponse du customer après celle de la serveuse. Faux ! pour plusieurs raisons.
imaginons que la serveuse a 3 actions dans sa file d'attente. Le ActionspeakString vient en 4 eme position et ne s'éxécute pas de suite. Par contre, le customer est vierge de toute action. Donc, le AssignCommand(oCustomer, ...) (qui ext éxécuté de suite, demande au customer de parler, alors que la serveuse n'a pas encore posé sa question.

Le code "correct" est

// demande au client de s'asseoir (le force !)
AssignCommand( oCustomer ,ActionSit( oNearestChair ) );
// prochaine action de la serveuse, parler
ActionSpeakString(usr_Rndspeak(1)) ;
// immediatly stores the answer
CustAnswer =usr_Rndspeak(2);
SetLocalString(OBJECT_SELF , "CUSTANSW" ,CustAnswer);
// prochaine action de la serveuse : ordonner au client de répondre !
// L'utilisation de ActionDoCommand synchronise le démarrage de l'action du client. -
// idealement, les changements d'etat doivent aussi se faire quand les actions de la serveuse sont terminés donc "enveloppés" dans des ActionDoCommand();
ActionDoCommand( AssignCommand( oCustomer ,SpeakString(CustAnswer) )) ;



Le script modifié le 17-7

//------------------------------------------------------------
// Script de Barmaid.
// Barmaid States
// 0 -> Rnd Walk, wanders for Client.
// 1 -> Client Found . Moves to he nearest (rnd) customer.
// 2 -> Client sits, Ask for Command
// 3 -> Client answers
// 4 -> Moves to the bar to get the Drinks
// 5 -> Announce the comand
// 6 -> Moves back to the custommer to deliver.
// 7 -> Deliver
//------------------------------------------------------------


string usr_Rndspeak( int type );

//----------------------------------------------------------
//
// Main routine.
//
//
//----------------------------------------------------------
object oCustomer; //= GetLocalObject(OBJECT_SELF, "CUSTOMER");
object oBar = GetWaypointByTag("WP_Bar"); //This waypoint is where she gets drinks from

void main()
{
int nRandom;
// Get from context the Last chair seen !
object oNearestChair = GetLocalObject (OBJECT_SELF, "CHAIR" );
object oCustomer = GetLocalObject(OBJECT_SELF, "CUSTOMER");
int state = GetLocalInt(OBJECT_SELF, "BARMAID_STATE");
// customer answer
string CustAnswer= GetLocalString(OBJECT_SELF , "CUSTANSW" );

// Barmaid state from context

// Get the User Defined Event that triggered this script

int nUser = GetUserDefinedEventNumber();

// Debug !
object oPlayer = GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR , PLAYER_CHAR_IS_PC);

SetCommandable(TRUE ,oCustomer);
switch(nUser)
{
case 1001 : // UD HeartBeat

switch( state )
{
case 0 : // Wander for customers

ClearAllActions(); // too many actions ?

oCustomer = GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, OBJECT_SELF, Random(5));
// SendMessageToPC(oPlayer, "Customer "+ObjectToString(oCustomer));

// search the Nearest Chair from Customer
oNearestChair = GetNearestObjectByTag( "Chair", oCustomer);

// SendMessageToPC(oPlayer, "Chair "+ObjectToString(oNearestChair));
// If Customer Found is Not he barKeeper
// && not him/herself
// && a valid object
// && not already sitted

if ( (oCustomer != GetObjectByTag("Barkeeper")) &&
(oCustomer != OBJECT_SELF) &&
GetIsObjectValid(oCustomer) &&
oCustomer != GetSittingCreature(oNearestChair))
{
// Move to Customer and ask what he/she wants

SetLocalInt (OBJECT_SELF, "BARMAID_STATE", 1);
SetLocalObject (OBJECT_SELF, "CUSTOMER",oCustomer );
SetLocalObject (OBJECT_SELF, "CHAIR",oNearestChair );

SetCommandable(TRUE ,oCustomer);
// Barmaid moves near Customer
}
else
{
// State is still 0 , and no Customer Found.
// Next HeartBeat will find a cusotmer *
ActionRandomWalk();
// SendMessageToPC(oPlayer, "Pas trouve");
return;
}

case 1:
ActionMoveToObject(oCustomer, FALSE,2.0f);
ActionDoCommand( SetLocalInt(OBJECT_SELF, "BARMAID_STATE", 2));

case 2:
// Ask a Rnd question: Type 1
ActionDoCommand( AssignCommand( oCustomer ,ActionDoCommand(ActionSit( oNearestChair )) ));
ActionSpeakString(usr_Rndspeak(1)) ;
// immediatly stores the answer
CustAnswer =usr_Rndspeak(2);
SetLocalString(OBJECT_SELF , "CUSTANSW" ,CustAnswer);
// ce assign command pour synchroniser la question et la reponse.

ActionDoCommand(AssignCommand( oCustomer ,SpeakString(CustAnswer)));
ActionDoCommand(SetLocalInt(OBJECT_SELF, "BARMAID_STATE", 4));

case 4:

ActionDoCommand(ActionMoveToObject(oBar));
ActionDoCommand(SetLocalInt(OBJECT_SELF, "BARMAID_STATE", 5));
// break;
case 5:
ActionDoCommand( ActionSpeakString( "Il me faut "+ CustAnswer));
ActionDoCommand(SetLocalInt(OBJECT_SELF, "BARMAID_STATE", 6));
break; // Waits 6 sec for the command (the next HeartBeat)

case 6:
ActionDoCommand (ActionMoveToObject(oCustomer));
ActionDoCommand (ActionSpeakString( usr_Rndspeak(3)));
ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE,1.0f, 1.0f);
AssignCommand(OBJECT_SELF,SetLocalInt(OBJECT_SELF, "BARMAID_STATE", 7));
break;

case 7: //Type 3 : deliver

// No More Busy !
AssignCommand(OBJECT_SELF,SetLocalInt(OBJECT_SELF, "BARMAID_STATE", 0));

// customer thanks.
// Waits 10 sec & leave the chair !
AssignCommand(OBJECT_SELF,AssignCommand( oCustomer ,SpeakString( usr_Rndspeak(4))));
AssignCommand(OBJECT_SELF,AssignCommand( oCustomer ,ActionWait(2.0f)));
AssignCommand(OBJECT_SELF,AssignCommand( oCustomer ,ActionMoveAwayFromObject(oNearestChair , FALSE , 3.0f)));


break;



} // switch (state)

break; //case 1001

case 1004:
// This is just in here so you can interrupt her if you want to talk to her
SetLocalObject (OBJECT_SELF, "CUSTOMER", OBJECT_INVALID);
SetLocalInt (OBJECT_SELF, "BARMAID_STATE", 0);
break;
}
}



//--------------------------------------------
// user Random Speak string !
//--------------------------------------------
string usr_Rndspeak( int type )
{
string toSpeak =";
int Rnd;
switch ( type )
{
case 1: // barmaid questions
Rnd = Random(3);
switch(Rnd)
{
case 0:
toSpeak = "Que prendrez-vous ?";
break;
case 1:
toSpeak = "Que desirez-vous ?";
break;
case 2:
toSpeak = "Et pour vous ce sera?";
break;
}
break;

case 2: // custommer answer
Rnd = Random(5); // be sure to set n to max case+1
switch(Rnd)
{
case 0:
toSpeak = "Deux bieres bien fraiches";
break;
case 1:
toSpeak = "Une cervelle de singe";
break;
case 2:
toSpeak = "Un roti de sanglier, bien cuit";
break;
case 3:
toSpeak = "Un poulet grille";
break;
case 4:
toSpeak = "Un poulet grille";
break;
}
break;

case 3:
Rnd = Random(4);
switch(Rnd)
{
case 0:
toSpeak = "Tenez, voici votre commande";
break;
case 1:
toSpeak = "Et voila, c'est pret.";
break;
case 2:
toSpeak = "Aussitot commande, aussitot servi";
break;
case 3:
toSpeak = "Vous etes servi";
break;

}
break;

case 4:
Rnd = Random(3);
switch(Rnd)
{
case 0:
toSpeak = "Merci bien";
break;
case 1:
toSpeak = "Ah ! enfin";
break;
case 2:
toSpeak = "Hum... ca a l'air delicieux";
break;
}
break;
}

return toSpeak;
}






Ce que j'ai appris en faisant ce code.

a) Attention au scripts qui durent plus de 6 secondes dans le HeartBeat ! ça fait des trucs bizarres. (problème de réentrance!)
b) SpeakString et ActionSpeakString c'est pas pareil ! SpeakString c'est immédiat , l'autre se place dans la file d'attente du personnage (utile pour synchroniser)
c)
AssignCommand( oCustomer ,SpeakString( usr_Rndspeak(4)) );

fonctionne alors que
AssignCommand( oCustomer ,ActionSpeakString( usr_Rndspeak(4)) );
Non ?!


Voila ! c'est tout.

:)

à mon avis, LA REFERENCE pour tout scripteur :) http://www.reapers.org/nwn/reference/

Par Lumina le 15/7/2002 à 23:00:20 (#1810541)

Pour que le personnage se leve de la chaise, je pense que tu dois faire "ClearAllActions()".

Par Adalorn le 16/7/2002 à 16:40:21 (#1813969)

eh non, ActionSit(oChair) fait s'asseoir le perso sur oChair, mais aprés, ce n'est plus une action, lorsqu'il reste assi, c'est comme s'il resatait sans bouger debout, normalement, il suffit de le faire bouger pourqu'il se léve (essaye ActionForceMoveToLocation)

Par Koryl le 16/7/2002 à 17:22:52 (#1814183)

Bon comme le tout premier script pour les leviers de marche pas, en voila un autre:


void main()
{
object oDoor = GetNearestObject(OBJECT_TYPE_DOOR);
int iDoorLocked = GetLocked(oDoor);
ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
ActionPlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
if (iDoorLocked == TRUE)
{
AssignCommand(oDoor, ActionOpenDoor(oDoor));
SetLocked(oDoor, FALSE);
}
else
{
AssignCommand(oDoor, ActionCloseDoor(oDoor));
SetLocked(oDoor, TRUE);
}
}



A mettre dans le OnUsed du levier

ps: on peut remplacer la premiere ligne par celle ci:

object oDoor = GetNearestObjectByTag("Tagdelaporte");

Faire parler un objet

Par Cassin le 16/7/2002 à 19:26:45 (#1814854)

Voilà le script pour faire parler n'importe quel objet :
(à mettre dans le OnUsedBy après avoir rendu l'objet "Useable")


void main()
{
object oPC = GetLastUsedBy();
if (GetIsPC(oPC))
{
ActionStartConversation(oPC, "NomDeLaConversation",TRUE);
}
}



Le même pour faire parler un trigger :
(à mettre dans le OnEnter)

void main()
{
object oPC = GetEnteringObject();
if (GetIsPC(oPC))
{
ActionStartConversation(oPC, "NomDeLaConversation",TRUE);
}
}

Une Taverne avec des horaires d'ouverture ! :)

Par [xkill]sniper! le 16/7/2002 à 23:30:18 (#1815956)

Bonjour.

Toujours pour tester l'API (les functions), j'ai imaginé faire une porte qui respecte des horaires d'ouverture !
ben oui, dans le jeu, les tavernes et maisons sont toujours ouvertes quelquesoit l'heure du jeu à laquelle vous passez ! (nuit, jour, tt le temps).

Bref, je me suis dit que dans un scenario, ça pourrait être sympa d'avoir une taverne (ou un autre lieu avec une porte) qui respecte des horaires d'ouverture.

Voici comment je fais.

a) je place une porte. Dans les proprietes de l'objet, onglet "basic" je coche plot (empêche le bash ?)
b) onglet lock, locked, can be relocked, key required. Pour le tag de la clef, j'indique un tag de clef qui n'existe pas!! :-)
c) dans l'onglet script je place le script suivant sur l'evt OnFailToOpen.

mon premier reflexe fut de le mettre sur onOpen, mais ça marche pas ! - Les scripts sont appelé quand l'evt s'est DEJA produit ! donc OnOpen, la porte est ouverte et s'est donc trop tard pour vérifier. En fait, il aurait fallu un onUse avec possibilité de "squizzer" l'action opendor demandée. Bref, c'est sur le OnFailToOpen qu'il faut agir.
C'est aussi pour cela qu'on utilise une clef sur la porte.
La porte est verrouillée, avec une clef qui n'existe pas ! c'est un "plot".
donc
pas de bash possible
pas de unlock possible.

Dès la premiere tentative d'utilisation, on tombe en OnFailToOpen
Voici le script qui est exécuté


/*----------------------------------------------------*/
/* Verification des horaires d'ouverture d'une porte */
/*----------------------------------------------------*/
void main()
{
int h1 = 10*60; // Heure d'ouverture en minutes 10h00
int h2 = 12*60+30; // 12h30
int h3 = 13*60+30; // 13h30
int h4 = 19*60; // 19h00 !

// calcul de l'heure actuelle en minute
int h = GetTimeHour()*60 + GetTimeMinute();

// verifie que c'est bien dans l'intervalle d'ouverture
int closed =( hh4 || ( h>h2 && h<h3) );

if (closed)
{
// pas de chance c'est ferme !
}
else
{
// deverouille la porte
SetLocked(OBJECT_SELF , FALSE);
// ouvre la porte
ActionOpenDoor(OBJECT_SELF);
// reverouille !
SetLocked(OBJECT_SELF , TRUE);
// demande a refermer dans 5 secondes
// j'ai verouille avant volontairement
DelayCommand(5.0f , ActionCloseDoor( OBJECT_SELF) );

}

}



Pour aider le joueur à comprendre ce qui se passe, juste à côté de laporte, je place une "pancarte" avec dans le champs description les horaires d'ouvertures de la porte ! :-)
Pancarte,
usable , plot , description = "Ouvert tous les jours de
10h00 à 12h30 et 13h30 à19h00"

Pour tester, voici un script à mettre sur le onUsed

void main()
{
int h = GetTimeHour();
int m = GetTimeMinute();
h=h+1;
SetTime( h , m , 1,1);
SpeakString("il est "+IntToString(h)+" heures et "+IntToString(m)+" minutes");
}

son but : faire avancer le temps plus vite !! :-) et vous afficher l'heure.
donc : click sur pancarte = j'avance le temps et ça me donne l'heure, examine pancarte = affichage de la description.

Si j'avais voulu faire une porte ouverte de 9h à 19h par exemple,
j'aurais mis
h1 = 9 , h2 =9, h3= 9 , h4 = 19 !

voila !
Have fun ..... :)

Par Skanzo Sylan le 18/7/2002 à 11:48:40 (#1822031)

À quoi sert que ducros il se décarcasse? :mdr:

GetTimeHour reprend l'heure du modules, ok la-dessus. C'est la même heure que l'on peut voir en suvolant le compas avec la souris.

Par contre GetTimeMinute est plus vicieux :)
Si je configure le module pour qu'une heure dans le jeu corresponde à trois minutes IRL, le temps va défiler ainsi:

13h00, 13h01, 13h02, 14h00, 14h01, 14h02, 15h00, et ainsi de suite à chaque minutes réelles qui passent.
D'où l'intéret de mon script qui corrige ce petit problème et affiche toutes les minutes de 00 à 59.


Si vous voyez les minutes passer trop vite, c'est que vous avez configuré le temps du module avec une courte durée pour les heures (1 minute pour 1 heure par exemple).

Pour configurer le quota de minutes réelles pour une heure de jeu, c'est Edit, Module Properties, onglet Advanced mais vous devez tous le savoir, c'est juste au cas où ;)


Hum... par contre, si quelqu'un a trouvé le moyen de récupérer la date et heure du serveur pour l'utiliser dans un script, ben je suis preneur, merci :merci:

Par [xkill]sniper! le 18/7/2002 à 13:39:54 (#1822688)

Provient du message de Skanzo Sylan
À quoi sert que ducros il se décarcasse? :mdr:

GetTimeHour reprend l'heure du modules, ok la-dessus. C'est la même heure que l'on peut voir en suvolant le compas avec la souris.

Par contre GetTimeMinute est plus vicieux :)
Si je configure le module pour qu'une heure dans le jeu corresponde à trois minutes IRL, le temps va défiler ainsi:

13h00, 13h01, 13h02, 14h00, 14h01, 14h02, 15h00, et ainsi de suite à chaque minutes réelles qui passent.
D'où l'intéret de mon script qui corrige ce petit problème et affiche toutes les minutes de 00 à 59.


Si vous voyez les minutes passer trop vite, c'est que vous avez configuré le temps du module avec une courte durée pour les heures (1 minute pour 1 heure par exemple).

Pour configurer le quota de minutes réelles pour une heure de jeu, c'est Edit, Module Properties, onglet Advanced mais vous devez tous le savoir, c'est juste au cas où ;)


Hum... par contre, si quelqu'un a trouvé le moyen de récupérer la date et heure du serveur pour l'utiliser dans un script, ben je suis preneur, merci :merci:


Ok, si ta remarque était liée à mon POST, je ne vois pas corrélation ! Merci de dire ou ça cloche ? ;)

Par Kemay le 20/7/2002 à 17:43:41 (#1834354)

Script modifiant les règles de changement de niveau

1. Nom du script: Conditions sur le passage de niveau

2. Qu'est-ce ça fait: Si un personnage ne remplit pas les conditions necessaires, après être passé de niveau il est "renvoyé" aux Classes/Niveaux précédant le passage de niveau.

ATTENTION: Si un personnage essaie de changer de commencer une nouvelle classe alors qu'il ne remplit pas les conditions définies, son personnage deviendra niveau 0 dans la nouvelle classe, ce qui peut rendre le personnage totalement inutilisable car le jeu considère les personnages niveau 0 comme corrompus. Si vous utilisez un script de ce genre, prévenez vos joueurs que s'ils essaient de commencer une nouvelle classe sans suivre l'entraînment correspondant, il risquent tout simplement de foutre en l'air leur perso

3. Notes: Le script lui même est un include. c'est à dire que pour utiliser les fonctions qu'il contient dans un script, ce dernier doit commencer par : #include "nom_donné_au_script_inclus"

4. Le script

/*-----------------------------------------------------------------------------
Conditions sur le Passage de Niveau
------------------------------------------------------------------------------*/
///////////////////////////////////////////////////////////////////////////////
//Interface
///////////////////////////////////////////////////////////////////////////////

//A placer dans l'event onLevelUp du module
//Verifie si un joueur qui vient de passer de niveau etait autorise
//a gagner un niveau dans la classe ou il est passe
//Si ce n'est pas le cas, annule le passage de niveau ;
//Si c'est le cas reinitialise les variables pour le prochain niveau
//sMessage sera envoye au joueur s'il passe de niveau dans une
//classe non autorisee
void CheckClassLevelled (string sMessage = "Vous n'avez pas
ete forme pour passer de niveau dans cette classe.");

//Autorise oPC a passer de niveau dans une classe CLASS_TYPE
//sMessage est envoye au joueur pour le prevenir
void EnableLevelling (int CLASS_TYPE, object oPC, string sMessage = "Vous pouvez maintenant passer de niveau dans la
classe pour laquelle vous avez ete forme");

//Empeche oPC de passer de niveau dans une classe CLAS_TYPE
void DisableLevelling (int CLASS_TYPE, object oPC, string sMessage = ");

//Retourne le nombre d'xp necessaire pour atteindre le niveau Level
int GetNextLevelExp(int Level);

//Retourne le niveau global de oPC (cumul de toutes ses classes)
int GetTotalLevel(object oPC);

//Verifie si oPC a assez d'xp pour passer de niveau
//retourne TRUE si c'est vrai, FALSE si c'est faux
int CheckXP(object oPC);

//Verifie si oPC a assez d'xp pour passer de niveau
//Si oui, sMessage est envoye a oPC pour l'informer des
//conditions de passage de niveau
void OptionCheckXP(object oPC,string sMessage="Avant de pouvoir passer de niveau,
vous devez suivre l'entrainement approprie");

///////////////////////////////////////////////////////////////////////////////
// Les Nouvelles fonctions
///////////////////////////////////////////////////////////////////////////////

void CheckClassLevelled (string sMessage){
//definir oPC comme etant le joueur qui vient de passer de niveau
object oPC = GetPCLevellingUp();
//Verifier que le joueur soit passe de niveau dans une classe pour
//laquelle il remplit les conditions
int iClass = 0;
while (iClass < 11) {
//Si il est passe de niveau dans une classe non autorisee
if ( GetLocalInt(oPC,"OldClass"+IntToString(iClass)) < GetLevelByClass(iClass,oPC)
&& GetLocalInt(oPC,"Class"+IntToString(iClass)+"Allowed")==0 ){
//Retenir le total de points d'experience de oPC au moment
//du passage de niveau
int StoredXP = GetXP(oPC);
//le ramener au niveau/classe precedant le passage de niveau
SetXP(oPC,GetNextLevelExp(GetTotalLevel(oPC)-1)-1);
//l'informer qu'il n'est pas passe de niveau dans la bonne classe
SendMessageToPC(oPC,sMessage);
AssignCommand(oPC,ClearAllActions());
SetXP(oPC,StoredXP);}
//Si tout se passe bien reinitialiser les conditions pour le prochain niveau
else DisableLevelling (iClass,oPC);
iClass++; }
}


void EnableLevelling (int CLASS_TYPE, object oPC,string sMessage){
//Retenir les niveaux de oPC dans chaque classe
int iClass = 0;
while (iClass < 11) {
SetLocalInt(oPC,"OldClass"+IntToString(iClass),GetLevelByClass(iClass,oPC));
iClass++; }
//Autoriser le passage de niveaux dans la classe CLASS_TYPE
SetLocalInt(oPC,"Class"+IntToString(CLASS_TYPE)+"Allowed",1);
//Informer le joueur
SendMessageToPC(oPC,sMessage); }

void DisableLevelling (int CLASS_TYPE, object oPC,string sMessage){
//Empecher le passage de niveaux dans la classe CLASS_TYPE
SetLocalInt (oPC,"Class"+IntToString(CLASS_TYPE)+"Allowed",0);
SendMessageToPC(oPC,sMessage); }


int GetNextLevelExp(int Level) {
int Exp = 0;
int i = 1;
while (i Exp ) {
SendMessageToPC(oPartyMember,sMessage); }
oPartyMember = GetNextFactionMember(oPC, TRUE); }
}

int CheckXP(object oPC){
int TotalLevel = GetTotalLevel(oPC);
int Exp = GetNextLevelExp(TotalLevel);
if ( GetXP(oPC) > Exp ) return TRUE;
return FALSE; }



Utilisation: Pour utiliser les fonctions de ce script dans un module :

1) Créer un nouveau module avec le ToolSet ou en ouvrir un existant pour le modifier.

2) Ouvrir le Script Editor (Rubrique Tools de la barre d'outil).

3) Recopier le script ci-dessus et enregistrer le sous le nom de votre choix (préférablement facile a retenir, genre :levelup_include)

4) Dans les proprietes du modules (Rubrique Edit de la barre d'outil), onglet Events, éditer le OnLevelUp event :
#include "levelup_include"
void main()
{
CheckClassLeveled("Message que vous voulez envoyer au joueur quand il essaie
de passer de niveau dans une classe pour laquelle il ne remplit pas les conditions");
}


Note: Par defaut le joueur ne peut passer de niveau dans aucune classe.

5 ) Pour autoriser un joueur a passer de niveau dans une classe, il suffit d'utiliser la fonction EnableLevelling (int CLASS_TYPE, object oPC, string sMessage)
Par exemple pour autoriser un personnage a passer un niveau de guerrier après avoir parler à Gunther le Maître d'Arme du coin, il suffit de placer dans l'onglet ActionTaken
du noeud de la conversation où vous voulez que ça se passe :
#include "levelup_include"
void main()
{
EnableLevelling(CLASS_TYPE_FIGHTER, GetPCSpeaker(), "Vous pouvez progresser dans la classe de guerrier!");
}


6) Pour empêcher un joueur a passer de niveau dans une classe, il suffit d'utiliser la fonction DisableLevelling (int CLASS_TYPE, object oPC, string sMessage)
Par exemple, dans le module tout le monde peut passer de niveau comme il veut. Mais si un PC paladin tue Lili la gentille petite fille du coin, il ne pourra plus gagner de niveau de paladin. Il suffirait de placer dans le onDeath event de Lili :
#include "levelup_include"
void main()
{
DisableLevelling(CLASS_TYPE_PALADIN, GetLastKiller(),"Après un telle ignominie, n'espérez plus pouvoir
continuer dans la voie du paladin!");
}


7) CheckXP(object oPC) Pour vérifier si le joueur a assez de points d'experience pour passer de niveau avant de lui offrir la possibilité de remplir les conditions nécessaires au passage de niveau... hmm ce sera plus clair avec un exemple
Gunther (notre fameux maître d'arme de tout à l'heure) ne propose au joueur de l'entraîner que si le joueur a assez de points d'experience pour gagner un niveau. Dans l'onglet Starting Conditional du noeud de la conversation où Gunther propose l'entraînement :
#include "levelup_include"
void main()
{
CheckXP(GetPCSpeaker());
}


8) Optionnel et non testé: prévenir le joueur des conditions générales de passage de niveau du module lorsqu'il atteint le nombre d'xp nécessaire pour passer au niveau supérieur.
Ajouter a tous les onDeath script (le plus simple est de l'ajouter au script par défaut du module) tout en haut du script (avant void main() ) #include levelup_include
et tout en bas du script (juste avant la derniere } ) OptionCheckXP(GetLastKiller(),"message que vous souhaitez envoyer au joueur"); Puis dans le reste du module à chaque fois que vous utilisez l'une des fonctions GiveXPToCreature ou SetXP, ajoutez tout en haut du script #include levelup_include et ajoutez OptionCheckExp(objet_dont_les_xp_ont_ete_modifiés) la ligne suivant celle ou ont été modifiés les xp.

Par Skanzo Sylan le 21/7/2002 à 17:37:03 (#1837848)

Xkill, je voulais simplement prevenir que les script utilisant GetTimeMinute ne peuvent fonctionner sur tout les modules sans une certaine modif.

Si tu configure ton module pour qu'une heure dans le module corresponde à un quart d'heure réel, ben GetTimeMinute n'affichera jamais 30 minutes.

Disons qu'il est environ 13h45 sur le module, tu te dit que la porte est ouverte... :confus:
et ben non paske GetTimeMinute va fournir une informations fausse, environ 12 minutes (réelles) si tu as configuré le module comme si dessus.

Bien sûr, si tu as mis que 60 minutes correspond à une heure dans ton monde, ça marchera mais pô sur les autres.

GetTimeMinute avance avec les minutes réelles :)

Par Nethaneel le 22/7/2002 à 23:00:51 (#1844923)

Moi je voudras que quelqu'un m'aide pour un script de soin.
J'aimerai avoir un NPC qui fasse comme Aribetn au début du jeu, mais j'y arrive pô!
Avec un Castspell je suppose mais je sais aps quel zattribut mettre ^_^
Et oui je suis une Quiche!

Par Chaco le 23/7/2002 à 14:46:16 (#1847771)

Voici mon premier post sur le forum

Je n'ai pas testé le script (je suis à mon TAF), mais cela devrait fonctionner ; j'espère que cela aidera


//Script pour guérir un perso et lui redonner ses PV
//Il suffit de placer le script dans une conversation à ACTION TAKEN
//Exemple :
//PC : Pouvez-vous me guérir ?
//NPC : Oui ! (Action Taken : insérer le script après l'avoir nommé)

void main() {
object oSpeaker = GetPCSpeaker();
//Le PC recupère la totalité de ses points de vie
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oSpeaker)),oSpeaker);
//On vire éventuellement les maux dont est affecté le speaker
RemoveEffects(oSpeaker);
//SPELL_BLESS : Effet de sort de BLess à remplacer par ce que tu veux
//Cette fonction simule le sort, il n'a aucune conséquence
ActionCastFakeSpellAtObject(SPELL_BLESS, oSpeaker);
}

Par Nethaneel le 23/7/2002 à 20:08:36 (#1849816)

Pour le script de guérison cela fonctionne. Le seul hic, c'est pour les statuts. Ben oui, le removeeffect, c pour un effet. Alors peut être le mieux c'est de créer une macro(un include) qui rassemble tous les effets en un, comme ça on appel cet unique effet dans la fonction. Sinon faut se taper les dizaines de maladies, de mal sorts, de ploymorphes....

...

Par izuall le 23/7/2002 à 20:30:57 (#1849936)

hummmm Chaco , te connaitrais-je ??? j'ais un leger soupcons .

Par Koryl le 23/7/2002 à 21:00:53 (#1850106)

Pour la guérison, voici le script utilisé dans la campagne solo:



//::///////////////////////////////////////////////
//:: Temple Cast Heal
//:: NW_D1_TEMPLEHEAL.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Fakes the effects of a greater restorations spell on the PC and
any associates.
*/
//:://////////////////////////////////////////////
//:: Created By: Aidan
//:: Created On: May29,2002
//:://////////////////////////////////////////////
void FakeRestore(object oTarget);

void main()
{
object oPC = GetPCSpeaker();
object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN,oPC);
object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oPC);
object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oPC);
object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED,oPC);
object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED,oPC);
ActionPauseConversation();
ActionCastFakeSpellAtObject(SPELL_GREATER_RESTORATION, OBJECT_SELF);
ActionDoCommand(FakeRestore(oPC));
if(GetIsObjectValid(oHenchman))
{
ActionDoCommand(FakeRestore(oHenchman));
// checks to see if they have any cure crital wound potions; if not, creates it on them.
if (!GetIsObjectValid(GetItemPossessedBy(oHenchman,"NW_IT_MPOTION003")))
{
CreateItemOnObject("NW_IT_MPOTION003",oHenchman,3);
}
}
if(GetIsObjectValid(oAnimal))
{
ActionDoCommand(FakeRestore(oAnimal));
}
if(GetIsObjectValid(oFamiliar))
{
ActionDoCommand(FakeRestore(oFamiliar));
}
if(GetIsObjectValid(oDominated))
{
ActionDoCommand(FakeRestore(oDominated));
}
if(GetIsObjectValid(oSummoned))
{
ActionDoCommand(FakeRestore(oSummoned));
}
ActionResumeConversation();
}

void FakeRestore(object oTarget)
{
effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION_GREATER);

effect eBad = GetFirstEffect(oTarget);
//Search for negative effects
while(GetIsEffectValid(eBad))
{
if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
GetEffectType(eBad) == EFFECT_TYPE_CURSE ||
GetEffectType(eBad) == EFFECT_TYPE_DISEASE ||
GetEffectType(eBad) == EFFECT_TYPE_POISON ||
GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
{
//Remove effect if it is negative.
RemoveEffect(oTarget, eBad);
}
eBad = GetNextEffect(oTarget);
}
if(GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD)
{
//Apply the VFX impact and effects
int nHeal = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget);
effect eHeal = EffectHeal(nHeal);
if (nHeal > 0)
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget);
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oTarget);


:cool:

2 petits scripts que j'ai trouver sympas

Par Shanaee le 24/7/2002 à 2:45:40 (#1851639)

Le 1er pour d'une fontaine lance un sort dans vous la touché:

Deja il faut que la fontaine soit utilisable et le script est a mettre dans OnUsed.
------------------------------------------------------------------------------------
void main()
{
object oPC = GetLastUsedBy();
int cSpell = SPELL_HEAL;
int bCheat = 1;
int bInstantSpell = 1;
string sSpeakString = "Mettre le texte que vous voulez voir apparaitre quand le sort est lancer";
{
ActionSpeakString(sSpeakString);
ActionCastSpellAtObject(cSpell, oPC, bCheat, bInstantSpell);
}
}

------------------------------------------------------------------------------------

Le 2ème script est pour faire devenir PNJ un PNJ-statue:



//:: Name: NPC Statues
//:: FileName: npc_statue
// Used to make a sort of "living statue" prop to
// add a bit of eerie ambience to an area.
// 1. Create a custom NPC
// 2. Place whatever you wish in its inventory--
// torches/light items recommended
// 3. Remove all scripts from NPC
// 4. Place this script in OnSpawn
// 5. Place NPC in area
//
// Created By: Todmaerin
// Created On: 6/23/02
void main()
{
// Target NPC
object oTarget = OBJECT_SELF;

// Don't want this wearing off now, do we?
int nDurationType = DURATION_TYPE_PERMANENT;

// Declare effect1, the paralyze.
effect eEffect1 = EffectParalyze();

// Declare effect2, the stoneskin visual
effect eEffect2 = EffectVisualEffect (VFX_DUR_PROT_STONESKIN);

// now apply it, and keep it.
ApplyEffectToObject (nDurationType, eEffect1, oTarget);
ApplyEffectToObject (nDurationType, eEffect2, oTarget);
SetPlotFlag(oTarget, TRUE);
}

------------------------------------------------------------------------------------


J'en profite pour remercier tout le monde pour vos scripts et cours car jour après jour je deviens de moins en moins...comment vous dites deja?? Ah...oui quiche ;)

Mais quand on est pas doué en anglais et encore moins en script, c'est franchement pas évident.

Par Azrael07 le 24/7/2002 à 15:31:55 (#1854260)

Comme promis dans un coin paumé du forum je vais donné un script pour "emuler" un OnHeartBeat, qui sera activé uniquement si un joueur est dans l'area.
C je pense bcp moins lourd que le OnHeartBeat.

Bon finis les blabla voici le fameux code :

Dans le OnModuleLoad rajoutez la ligne suivante

SetLocalInt(GetObjectByTag("TAGAREA"),"iPlayerInAreaTAGAREA",0);
//Ca correspond a une variable qui donne le nombre de joueur actuelement dans l'area conserné.

Puis dans le OnPlayerEnter de l'area

//OnHeartBeat emulator
//Created by Azrael
//File for OnEnter of area

int iPlayerInArea;//Nombre de joueurs dans l'area
void main()
{
iPlayerInArea = GetLocalInt(OBJECT_SELF, "iPlayerInAreaTAGAREA");//On recupere l'integer qui sauvegarde le nombre de joueurs dans l'area
iPlayerInArea++;//On incremente la valeur
SetLocalInt(OBJECT_SELF,"iPlayerInAreaTAGAREA", iPlayerInArea);//Et on l'archive de nouveau
if (iPlayerInArea == 1)//Si c'est le premier joueur qui arrive
{
ExecuteScript("NOMDUSCRIPT",OBJECT_SELF);//On active le script qui definira l'action
}

}

Dans le OnExit meme chose :

//OnHeartBeat emulator
//Created by Azrael
//File for OnExit of area

int iPlayerInArea;//Nombre de joueurs dans l'area
void main()
{
iPlayerInArea = GetLocalInt(OBJECT_SELF, "iPlayerInAreaTAGAREA");//On recupere l'integer qui sauvegarde le nombre de joueurs dans l'area
iPlayerInArea--;//On reduit la valeur
SetLocalInt(OBJECT_SELF,"iPlayerInAreaTAGAREA", iPlayerInArea);//Et on l'archive de nouveau
}

Maintenant voici le gros paquet, c'est un script independant appelé par ExecuteScript("NOMDUSCRIPT",OBJECT_SELF), mais vous devriez donner un autre nom pasque NOMDUSCRIPT c pas terrible -lol-

//OnHeartBeat emulator
//Created by Azrael
//New script called by OnEnter of area

//Le nombre de joueurs dans l'area, indispensable pour pouvoir tout arreter si y'en a plus
int iPlayerInArea = GetLocalInt(OBJECT_SELF,"iPlayerInAreaTAGAREA");
int iSecond;//Pour retenir la seconde (voir + loin)
int iNextAction = GetTimeSecond();//La prochaine action realisee

void main()
{
while(iPlayerInArea > 0)//S'il n'y a plus de joueurs la boucle se termine
{
//On retient la seconde actuelle pour :
// 1.Ne pas surcharger en appelant tjrs le temp par la fct
// 2.Etre sur qu'on ne change pas de secondes entre deux lignes de codes (tres peu probable mais possible)
iSecond = GetTimeSecond();
//Si il y a eut 6 secondes depuis la derniere action...
if (iNextAction >= iSecond)
{
//...On reinitialise la variable du temp pour la prochaines action

//En revenant a zero si le temp a depasse 54(prochaine action dans 6s : 54+6 = 60, c a dire hors de l'echelle des secondes

if (iSecond >= 54)
{
iNextAction = iSecond - 54;
}
else
{
iNextAction = GetTimeSecond() + 6;
}

//Ici on a reproduit un OnHeartBeat qui ne se produit que si des joueurs sont dans l'area.
//Vous pouvez donc mettre ici votre code comme normal
//Si vous faites un ExecuteScript vous pouvez meme cibler un autre objet
}
//On update le nombre de joueurs present dans l'area
iPlayerInArea = GetLocalInt(OBJECT_SELF,"iPlayerInAreaTAGAREA");
}
}



Alors l'interet d'appeler un nouveau script au niveau du OnEnter, c d'une part pasque je trouve que c plus propre, bon c vrai qu'on s'en fous que ca soit sale du temp que ca marche...
D'autre part je ne suis pas sur que l'on puisse appeler deux fois le meme script en meme temp.

A oui je viens de penser a un bug : si jamais un joueur meurt dans l'arene?
Il faudrait rajouter dans le OnPlayerDeath du module un code du style "Si le player est dans l'arène, alors virer un player dans iPlayerInAreaTAGAREA.

Bon maintenant la question qui tue : a quoi ca sert puisqu'on a deja le OnHeartBeat :confus: :confus: :confus:
En fait, le serveur n'aura a calculer l'action que si un joueur est dans l'area, contrairement au OnHeartBeat.

Le problème c que g pas pu le tester car jusqu'a la fin des vacances je suis sur un pII 350, alors si Aurora peut passer, neverwinter c meme pas la peine
Je vais ouvrir un post sur le forum pour commenter le script, comme Uther a demander, y'en a qui on dut oublier, de pas commenter les scripts dirrectement sur cette page...

N'hesitez pas à me donner toutes propositions/améliorations, coup de geule, enfin je sais pas moi.

Et puis si y'a qlq qui veux bien le tester pour etre bien sur que ca marche...

un scrip qui permet de lancer un effet ou de l arreter

Par Algalog le 24/7/2002 à 20:01:03 (#1855702)

[Script] un scrip qui permet de lancer un effet ou de l arreter

Il faut utiliser un "placeable" de type "effect".
Moi j ai utilisé un "Shaft of light".
Ensuite aller voir dans propriete de votre effet et decocher la case "Static" sinon ca marchera pas !
Et pis vous le desactive par la meme occasion.
Ensuite vous mettez le script sur n'importe quel event car on va chercher le "TagName" pour l'utiliser. Dans le script c'est "ShaftofLightBlue". Moi je l'utilise sur un trigger sur le OnEnter et OnExit
Je lance aussi un son pour faire vraiement style :)


void main()
{
//Declaration des 2 objets un pour l'effet et un pour le son
object efGlow=GetObjectByTag("ShaftofLightBlue");
object oFlmSnd=GetObjectByTag("MagicGlowingBall");

//Ho la belle bleu !!!
AssignCommand(efGlow, ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
SoundObjectPlay(oFlmSnd);
}


Pour arreter c'est le meme principe


void main()
{
//Declaration des 2 objets un pour l'effet et un pour le son
object efGlow=GetObjectByTag("ShaftofLightBlue");
object oFlmSnd=GetObjectByTag("MagicGlowingBall");

//Ho la belle bleu !!!
AssignCommand(efGlow, ActionPlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
SoundObjectStop(oFlmSnd);
}


Voilou have fun :)

Gestion des logs V2

Par Gargantuel le 29/7/2002 à 0:46:25 (#1870240)

Gestion des logs V2 à usage d'univers persistant ou semi persistant

Ceci est une gestion assez complete des logs pour pouvoir debugger des gros modules et logger ce que les joueurs y font.


http://forums.jeuxonline.info/showthread.php?s=&threadid=106654

Re: Allez directement en Prison, ne passez pas par la case départ

Par Barkive|Heaven le 30/7/2002 à 12:18:15 (#1875161)

Provient du message de Shelzard
Voici un petit script anti-tueur de NPC :)
Mieux que de rendre les NPC invincible, mieux que les summons de guardes, mieux que l'instakill du PC qui attaque le NPC.

La Prison ! :)
le but de ce script, est de téléporter le PC attaquant dans une Zone (et de préférence une prison).



Ce scripte est une très bonne idée, merci je l'ai inclus dans mon mod. Par contre, il y a un truc qui fonctionne pas bien chez moi c'est que le perso se retrouve en prison uniquement quand il attaque le npc au cac mais quand il utilise la magie le scripte ne fonctionne pas.

Par Cradle_of_Borgir le 30/7/2002 à 22:24:03 (#1878518)

Bonjour à tous :)

Tt d'abord, jai trouver des scripts super utiles et mm inclus dans le module ke je fais .... seulement la je cherche a faire un tit truc marrant mais à défaut d'avoir trouver ( presk mem chercher ), je demande votre aide ...:aide:
Bon j'explique : le PC est dans une cryptr, une grande salle, un peu plus loin dans la salle, ya un sarcophage et deux statue a cote.
Le truc c'est ke juste a kelk metre du sarcophage je voudrais mettre un event ki ai pour effet de faire ouvrir le sarcophage tt seul, de faire par la mm occasion aparaitre ... un mort vivant, + le bruit du sarcophage ki s'ouvre ( mais ca je sais pas si ya un fichiers sons comme ca dans l'éditeur:confus: ).
Si vous pouviez m'aider, meme une fonctions pourrait m'aider ( enfin ca .... :bouffon: )..
@++

Merci de me repondre thx ...

Par yenal le 31/7/2002 à 13:41:29 (#1881977)

bon bah c super g testé la plus part de vos scripts ki sont bien cool mais g un chti probleme avec le 1er ( levier )...

En effet malgré que usable soit coché, mon personnage se presente devant le levier et est incapable de l'utilisé...

thx d'avance


Vala si qqu pouvait me donner une explication ca serait bien cool:confus:

Par Gorgo le 1/8/2002 à 9:49:23 (#1888147)

Vérifie le script il marche très bien mais faut juste déclare une variable supplémentaire je pense, je sais plus laquelle mais c'est une connerie du genre...

euhhh oui....

Par yenal le 1/8/2002 à 19:35:38 (#1892813)

le script marche surement tres bien mais le petit probleme c'est que quand je demande a mon pj d'utiliser le levier ce dernier ne bouge meme pas ...

qqu a une chtite idee pour remedier a ma connerie sans borne ?
:D :confus: :confus:

Par Nethaneel le 5/8/2002 à 16:03:45 (#1918828)

Je voudrais faire un script qui interdit l'accés à un module : les restrictions pourraient se faire en fonction d'un objet et de l classe.
Alors j'ai essayé avec les constantes CLASS_TYPE_X et j'ai mis ca dans le scirpt de "Transition Area". Mais ca marche po. Et pour l'objet je sais pas comment faire.
A+

Par Ascarnil le 8/8/2002 à 0:34:53 (#1932484)

Sympa tous ca moi qui cherchais un truc sur le cadran solaire :)

Par Ascarnil le 8/8/2002 à 0:35:54 (#1932490)

OOPs fausse manip..

Par tonton le grognon le 11/8/2002 à 8:33:18 (#1945642)

une bonne source de script que je recolle ici :

http://www.korinth.com/nwn/index.shtml


c'est en anglais, mais il contient TOUS les scripts marchants paru sur le forum bioware dans le thread "working script"

ma pierre a l'édifice

Par Blam le 12/8/2002 à 11:30:58 (#1949890)

Script de respawn spécial
Voici un script de respawn complet, qui fonctionne.
A la mort des joueurs ils "respawn" a des endroits différents en fontion de leur alignemment.

Merci a ceux qui m'ont aidé.

A mettre dans le edit/module properties/events/OnPlayerRespawn

////////////////////////////////////////////////////////////////////////////////
/////Script de BlamReconstruit par Fed et fini par Kemay////
////////////////////////////////////////////////////////////////////////////////
/////Objet: Rappel dans les temples correspondants a l'alignement du joueur/////
/////Date : 10 /08/2002/////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

#include "nw_i0_plot"

// * Applies an XP and GP penalty
// * to the player respawning
void ApplyPenalty(object oDead)
{
int nXP = GetXP(oDead);
int nPenalty = 50 * GetHitDice(oDead);
int nHD = GetHitDice(oDead);
// * You can not lose a level with this respawning
int nMin = ((nHD * (nHD - 1)) / 2) * 1000;

int nNewXP = nXP - nPenalty;
if (nNewXP 10000)
{
nGoldToTake = 10000;
}
AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));
}

void main()
{

object oRespawner = GetLastRespawnButtonPresser();
int nAlignementLawChaos = GetAlignmentLawChaos(oRespawner);
int nAlignementGoodEvil = GetAlignmentGoodEvil(oRespawner);


ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
RemoveEffects(oRespawner);


// Return PC to respawn point based on alignement.

string sDestTag = "WP_";

switch (nAlignementLawChaos)
{
case ALIGNMENT_CHAOTIC:
sDestTag = sDestTag + "CHAOTIC_";
break;

case ALIGNMENT_NEUTRAL:
sDestTag = sDestTag + "NEUTRAL_";
break;

case ALIGNMENT_LAWFUL:
sDestTag = sDestTag + "LAWFUL_";
break;
}

switch (nAlignementGoodEvil)
{
case ALIGNMENT_GOOD:
sDestTag = sDestTag + "GOOD";
break;

case ALIGNMENT_NEUTRAL:
sDestTag = sDestTag + "NEUTRAL";
break;

case ALIGNMENT_EVIL:
sDestTag = sDestTag + "EVIL";
break;
}

// Apply any penalties.
ApplyPenalty(oRespawner);

object oDest = GetWaypointByTag(sDestTag);

// si le waypoint de destination n'existe pas
if (!GetIsObjectValid(oDest))
{
// utilise le waypoint par defaut
oDest = GetWaypointByTag("WP_DEFAULT_RESPAWN");
}

if (GetIsObjectValid(oDest))
{

SetLocalLocation(oRespawner, "NW_L_I_DIED_HERE", GetLocation(oRespawner));
SetLocalInt(oRespawner, "NW_L_I_DIED", 1);
AssignCommand(oRespawner,JumpToLocation(GetLocation(oDest)));
}

}

Puis sur les endroits choisi (sur la ou les zones) Mettre des Waypoints dont les tags auront ce format
WP_NEUTRAL_NEUTRAL
WP_LAWFUL_NEUTRAL
WP_CHAOTIC_NEUTRAL
ect......
et surtout

WP_DEFAULT_RESPAWN

C'est simple (sauf que moi j'ai été incapable de le faire, a part l'idée)

Re: euhhh oui....

Par twormar le 13/8/2002 à 8:33:15 (#1954805)

Provient du message de yenal
le script marche surement tres bien mais le petit probleme c'est que quand je demande a mon pj d'utiliser le levier ce dernier ne bouge meme pas ...


Je n'ai plus le script d'activation du levier sous les yeux mais quand on cree un object activable il arrive dans l'etat "defaut" qui doit correspondre a desactive je crois.
Si tu joues l'animation ACTIVATE, il faut que tu places le levier dans l'etat desactive. Attention le faire depuis un clic droit de la souris ne marche pas (enfin chez moi ca marche pas). Il faut editer les proprietes de l'objet pour aller le mettre sur desactive.
Inversement pour DESACTIVATE, il faut placer le levier dans l'etat active.

J'espere que ca va t'aider...

Twormar Schliawinaght

Par Agone OCN le 14/8/2002 à 4:32:01 (#1959632)

vous avez une porte au bout d'une Area, et vous voulez qu'elle donne sur une autre area ?

Voila :

void main()
{
object oDoor1=GetObjectByTag("tagdelaporteareaX");
object oDoor2=GetObjectByTag("tagdelaporteareaY");
location lLoc=GetLocation(oDoor2);
object oPC=GetLastOpenedBy ();
AssignCommand(oPC,JumpToLocation(lLoc));
}

a placer dans le OnOpen de chacune des portes et en inversant les Tag pour la 2e

C'est pas super utile mais c mon tout premier script alors je suis tellement contant que je vous le colle : la science c'est comme la confiture ... ... ...

Par tonton le grognon le 14/8/2002 à 8:01:06 (#1959860)

en fait ton script provoque une teleportation entre 2 portes.. (car pour changer d'area entre 2 portes, ya plus simple : utilise l'area transition des propriete de tes portes..)

de plus, si ton pc dispose d'un familier ou d'un suivant.. pas sur qu'il le suive.. à tester...

Par Mariane le 14/8/2002 à 8:07:33 (#1959875)

Voici un script d'un autel pour le GFugue Plane des HCR qui fonctionne. Merci mille fois à Kemay et Amaranthe!
J'ai juste ajouté une phrase pour quand la prière échoue (sinon l'autel ne réagissait pas de manière visible quand la prière n'était pas entendue).
Quand la prière est entendue, le PC est envoyé en lieu sûr (WayPoint de tag "wp_resurect") pour éviter qu'il se refasse tuer, avec son équipement et une pénalité XP+gold.


// Script pour un autel qui ressuscite les PCs dans le plan de la fugue et les transporte au waypoint "wp_resurect"
// Par Kemay, Amaranthe et Mariane (pour un ajout )
// Compatible avec les HCR 1.6.8+

#include "hc_inc_rezpen"

//A placer dans l'event onUsed de l'autel
void main()
{
//la phrase dire lorsqu'un personnage n'ayant pas de divinite definie essaie de prier
string sNoDeity = "Vous n'avez foi en aucun dieu, vous ne pouvez pas prier !";
//la phrase dire lorsqu'un personnage essaie de prier sans attendre une heure
string sAlreadyPrayed = "Vous ne pouvez prier votre dieu qu'une seule fois par 30 minutes.";
// la phrase à dire quand la prière a été inefficace
string sNoRez = "Votre prière n'a pas été entendue.";
//la duree en minutes reelles d'une heure dans le jeu
int nMinutes = 5;
//le pourcentage de chance que la priere soit entendue et le que la resurection soit effectuee
int nChance = 15;

object oMod = GetModule();
object oPC = GetLastUsedBy();
string sName = GetName(oPC);
string sCDK = GetPCPublicCDKey(oPC);
string sID = sName + sCDK;
string sDeity = GetDeity(oPC);
int bUsed = GetLocalInt(oPC,"AlreadyPrayed");
// le délai entre deux prières
float fDelay = 30.0*nMinutes;
location lDiedHere = GetLocation(GetWaypointByTag("wp_resurect"));

if( sDeity == " )
{
SendMessageToPC(oPC,sNoDeity);
return;
}

if( bUsed == TRUE )
{
SendMessageToPC(oPC,sAlreadyPrayed);
return;
}

if( bUsed == 0 )
{
SetLocalInt(oPC,"AlreadyPrayed",TRUE);
DelayCommand(fDelay,DeleteLocalInt(oPC,"AlreadyPrayed"));
int nRoll = d100();
if( nRoll <= nChance )
{
object oDeathCorpse = GetLocalObject(oMod,"DeathCorpse"+sID);
if(GetIsObjectValid(oDeathCorpse)) DestroyObject(oDeathCorpse);

if(GetLocalInt(oMod,"REZPENALTY"))
{
hcRezPenalty(oPC);
// Charge em and raise the dead man
int iPCGold = GetGold(oPC);
int iRezCost = 1500;
if (iRezCost < iPCGold) iRezCost = iPCGold;
TakeGoldFromCreature(iRezCost, oPC, TRUE);
}
AssignCommand(oPC,JumpToLocation(lDiedHere)) ;
}
else
{
SendMessageToPC(oPC,sNoRez);
}
}
}

Par Azrael07 le 14/8/2002 à 10:15:00 (#1960162)

pof un script que g pompé betement dans le module du jeu solo qui permet de mettre un cadavre de n'importe quelle créature

il suffit de faire un créature vivante et de mettre ca dans son OnSpawn.

void main()
{
ActionDoCommand(SetIsDestroyable(FALSE));
ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDeath(),OBJECT_SELF));
}

Merchant Multi level

Par Vanfanel le 18/8/2002 à 17:39:40 (#1979679)

le scripte vous donne la possibilite d'avoir un marchant avec un stock de produits different suivant le niveau du joueur
Exemple
Stock_1 de 1 a 5 en level
Stock_2 de 5 a 10 en level
Etc..
voila si vous trouve un truc pour se scripte, plus simple ou une boullette merci de me le faire savoir je debut en scripte et c mon premier scripte pondu par ma petit tete :D


//::///////////////////////////////////////////////////////////
//:: nom négociants multi niveaux
//:: nom du scripte ******************
//:://////////////////////////////////////////////////////////
/* négociants multi niveaux
suivant le niveau du Joueur le négociants propose
un stock different

cree un "merchants" comme suite
"nom_du_NPC"+_Stock_1
un numero de ref _1 ou _2 ou _3 Etc...
Exemple Toto_Stock_1 et place le scripte ds Actions taken
/////////////////////Pour Info////////////////////////////////
sNPCTag recuppere le tag du NPC négociants

//if(GetCharacterLevel(GetPCSpeaker()) >= 1 && GetCharacterLevel(GetPCSpeaker()) =1", Superieur ou Egal a 1 ET"&&" "= 1 && GetCharacterLevel(GetPCSpeaker()) = 5 && GetCharacterLevel(GetPCSpeaker()) = 10 && GetCharacterLevel(GetPCSpeaker()) = 15 && GetCharacterLevel(GetPCSpeaker()) <= 20)
{//test si stock dispo et cree oStock
if((oStock = GetObjectByTag(sNPCTag + "_Stock_4")) != OBJECT_INVALID)
{//ouvre le store au joueur
OpenStore(oStock, GetPCSpeaker());
}
else //si le oStock nu pu et trouve
{
ActionSpeakString("Impossible de trouve la marchandise");
}
}
else//retourne le message suivant si le niveau na pu etre determine
{
ActionSpeakString("Level joueur Invalide ??");
}
}

Le même en plus court

Par Jedaï le 22/8/2002 à 17:04:04 (#2005773)

En plus simple

//:://////////////////////////////////////////////////////////
//:: Cree par : Christophe (Vanfanel)
//:: Cree le : 18 Aout 2002
//:: Version : 1.3 Final
//:://////////////////////////////////////////////////////////
#include "NW_I0_GENERIC"

string sNPCTag = GetTag(OBJECT_SELF);
object oStock;
int nLvlPC = GetCharacterLevel(GetPCSpeaker());
int nStock, nLvlMoins, nLvlPlus;

void main()
{

for(nStock = 1, nStock = nLvlMoins && nLvlPC <= nLvlPlus)
{

if((oStock = GetObjectByTag(sNPCTag + "_Stock_"+ IntToString(nStock))) != OBJECT_INVALID)
{//ouvre le store au joueur
OpenStore(oStock, GetPCSpeaker());
}
else//si le oStock n'a pu être trouvé
{
ActionSpeakString("Impossible de trouver la marchandise");
}
}

}

}

oui plus simple

Par Vanfanel le 23/8/2002 à 11:45:18 (#2011040)

vu comme sa c plus simple, mais il et bourré d'erreur

for(nStock = 1, nStock < 5, nStock++) pas des , mais des ;

{nLvlMoins = 1; nLvlPlus = 5} et la tu a oublié le ; apres le 5, 10, 15, 20

sinon je voi que j'ai encor boucoups a apprendre en Programmation sa fait que 3 ou 4 semaines que je programme
:ange:
merci sa ma ouvere le regard sur la boucle For
le scripte corrige donne ca

//::///////////////////////////////////////////////////////////
//:: nom négociants multi niveaux
//:: nom du scripte ******************
//:://////////////////////////////////////////////////////////
/* négociants multi niveaux
suivant le niveau du Joueur le négociants propose
un stock different

cree un "merchants" comme suite
"nom_du_NPC"+_Stock_1
un numero de ref _1 ou _2 ou _3 Etc...
Exemple Toto_Stock_1 et place le scripte ds Actions taken

//:://////////////////////////////////////////////////////////
//:: Cree par : Christophe (Vanfanel) & Jedaï
//:: Cree le : 23 Aout 2002
//:: Version : 1.3 Final
//:://////////////////////////////////////////////////////////
#include "NW_I0_GENERIC"

string sNPCTag = GetTag(OBJECT_SELF);
object oStock;
int nLvlPC = GetCharacterLevel(GetPCSpeaker());
int nStock, nLvlMoins, nLvlPlus;

void main()
{
for(nStock = 1; nStock = nLvlMoins && nLvlPC <= nLvlPlus)
{

if((oStock = GetObjectByTag(sNPCTag + "_Stock_"+ IntToString(nStock))) != OBJECT_INVALID)
{//ouvre le store au joueur
OpenStore(oStock, GetPCSpeaker());
}
else//si le oStock n'a pu être trouvé
{
ActionSpeakString("Impossible de trouver la marchandise");
}
}

}

}

oups

Par Vanfanel le 23/8/2002 à 11:48:11 (#2011058)

dans le l'entete il manque un */

Ah la la

Par Jedaï le 23/8/2002 à 12:51:41 (#2011554)

terrible... Pour la boucle for je plaide pas trop coupable : en C je crois que ce sont des ",". Mais pour les ";" mama mia...

Sinon y a un truc que je trouve vraiment dommage, c'est que les messages ne respecte pas les incrémentations, ça rend vraiment les scripts moins clairs (oui je me suis cassé le cul à en faire dans mon message... :( ). Ah sinon ton script est super intéressant je trouve, pour un module qui s'adapte à tout niveau. :merci:

Dans ton premier script un personnage de niveau 5 se voyait ouvert deux stocks, je me demande ce qui arrive à ce moment là ? :confus: Tu as fais un essai ?

Ah oui

Par Vanfanel le 23/8/2002 à 20:04:07 (#2014675)

bien vu j'ai pas pense a ça avec une valeur egale sur 2 test on ouvre 2 stock donc en tout logic tu a une erreur mais en pratique
apres essai sa ouvre le stock du premier test qui retourne la valeur true/vrai

Spawn selon race et alignement

Par Shyehiem Azielm le 28/8/2002 à 0:50:29 (#2042157)


void main()
{


object oPc;
int iRace;
int iAlignementGoodEvil;
int iAlignementLawChaos;
location lSpawnEvil;
location lSpawnGood;


oPc = GetEnteringObject();
iRace = GetRacialType(oPc);
iAlignementGoodEvil = GetAlignmentGoodEvil(oPc);
iAlignementLawChaos = GetAlignmentLawChaos(oPc);

switch (iRace)
{
case RACIAL_TYPE_DWARF:
switch (iAlignementGoodEvil)
{
case ALIGNMENT_GOOD:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulGoodDwarf_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralGoodDwarf_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticGoodDwarf_WP")));
break;
}
case ALIGNMENT_NEUTRAL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulNeutralDwarf_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralNeutralDwarf_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticNeutralDwarf_WP")));
break;
}
case ALIGNMENT_EVIL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulEvilDwarf_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralEvilDwarf_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticEvilDwarf_WP")));
break;
}
}
case RACIAL_TYPE_ELF:
switch (iAlignementGoodEvil)
{
case ALIGNMENT_GOOD:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulGoodElf_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralGoodElf_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticGoodElf_WP")));
break;
}
case ALIGNMENT_NEUTRAL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulNeutralElf_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralNeutralElf_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticNeutralElf_WP")));
break;
}
case ALIGNMENT_EVIL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulEvilElf_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralEvilElf_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticEvilElf_WP")));
break;
}
}
case RACIAL_TYPE_GNOME:
switch (iAlignementGoodEvil)
{
case ALIGNMENT_GOOD:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulGoodGnome_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralGoodGnome_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticGoodGnome_WP")));
break;
}
case ALIGNMENT_NEUTRAL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulNeutralGnome_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralNeutralGnome_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticNeutralGnome_WP")));
break;
}
case ALIGNMENT_EVIL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulEvilGnome_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralEvilGnome_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticEvilGnome_WP")));
break;
}
}
case RACIAL_TYPE_HALFELF:
switch (iAlignementGoodEvil)
{
case ALIGNMENT_GOOD:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulGoodHalfElf_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralGoodHalfElf_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticGoodHalfElf_WP")));
break;
}
case ALIGNMENT_NEUTRAL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulNeutralHalfElf_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralNeutralHalfElf_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticNeutralHalfElf_WP")));
break;
}
case ALIGNMENT_EVIL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulEvilHalfElf_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralEvilHalfElf_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticEvilHalfElf_WP")));
break;
}
}
case RACIAL_TYPE_HALFLING:
switch (iAlignementGoodEvil)
{
case ALIGNMENT_GOOD:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulGoodHalfling_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralGoodHalfling_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticGoodHalfling_WP")));
break;
}
case ALIGNMENT_NEUTRAL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulNeutralHalfling_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralNeutralHalfling_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticNeutralHalfling_WP")));
break;
}
case ALIGNMENT_EVIL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulEvilHalfling_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralEvilHalfling_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticEvilHalfling_WP")));
break;
}
}
case RACIAL_TYPE_HALFORC:
switch (iAlignementGoodEvil)
{
case ALIGNMENT_GOOD:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulGoodHalfOrc_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralGoodHalfOrc_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticGoodHalfOrc_WP")));
break;
}
case ALIGNMENT_NEUTRAL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulNeutralHalfOrc_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralNeutralHalfOrc_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticNeutralHalfOrc_WP")));
break;
}
case ALIGNMENT_EVIL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulEvilHalfOrc_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralEvilHalfOrc_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticEvilHalfOrc_WP")));
break;
}
}
case RACIAL_TYPE_HUMAN:
switch (iAlignementGoodEvil)
{
case ALIGNMENT_GOOD:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulGoodHumain_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralGoodHumain_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticGoodHumain_WP")));
break;
}
case ALIGNMENT_NEUTRAL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulNeutralHumain_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralNeutralHumain_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticNeutralHumain_WP")));
break;
}
case ALIGNMENT_EVIL:
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnLawfulEvilHumain_WP")));
break;
case ALIGNMENT_NEUTRAL:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnNeutralEvilHumain_WP")));
break;
case ALIGNMENT_CHAOTIC:
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag("TDM_SpawnChaoticEvilHumain_WP")));
break;
}
}
}


}

Par Hécate le 30/8/2002 à 0:08:00 (#2057512)

Spawn selon race et alignement


void main()
{
object oPc;
int iRace;
int iAlignementGoodEvil;
int iAlignementLawChaos;
string sRace;
string sGoodEvil;
string sLawChaos;
string sTagDest; // string du tag reconstitué

oPc = GetEnteringObject();
iRace = GetRacialType(oPc);
iAlignementGoodEvil = GetAlignmentGoodEvil(oPc);
iAlignementLawChaos = GetAlignmentLawChaos(oPc);

switch (iRace)
{
case RACIAL_TYPE_DWARF:sRace = "Dwarf"; break;
case RACIAL_TYPE_ELF:sRace = "Elf"; break;
case RACIAL_TYPE_GNOME:sRace = "Gnome"; break;
case RACIAL_TYPE_HALFELF:sRace = "HalfElf"; break;
case RACIAL_TYPE_HALFLING:sRace = "Halfling"; break;
case RACIAL_TYPE_HALFORC:sRace = "HalfOrc"; break;
case RACIAL_TYPE_HUMAN:sRace = "Human"; break;
default : sRace = "Default"; break;
}
switch (iAlignementGoodEvil)
{
case ALIGNMENT_GOOD:sGoodEvil = "Good"; break;
case ALIGNMENT_NEUTRAL:sGoodEvil = "Neutral"; break;
case ALIGNMENT_EVIL:sGoodEvil = "Evil"; break;
default : sGoodEvil = "Default"; break;
}
switch (iAlignementLawChaos)
{
case ALIGNMENT_LAWFUL:sLawChaos = "Lawful"; break;
case ALIGNMENT_NEUTRAL:sLawChaos = "Neutral"; break;
case ALIGNMENT_CHAOTIC:sLawChaos = "Chaotic"; break;
default : sLawChaos = "Default"; break;
}

sTagDest = "TDM_Spawn"+sLawChaos+sGoodEvil+sRace+"_WP";
AssignCommand(oPc, ActionJumpToObject(GetObjectByTag(sTagDest)));
}

Problème...

Par MTorment le 3/9/2002 à 20:55:10 (#2090271)

Provient du message de Kemay
Script modifiant les règles de changement de niveau

1. Nom du script: Conditions sur le passage de niveau

2. Qu'est-ce ça fait: Si un personnage ne remplit pas les conditions necessaires, après être passé de niveau il est "renvoyé" aux Classes/Niveaux précédant le passage de niveau.

3. Notes: Le script lui même est un include. c'est à dire que pour utiliser les fonctions qu'il contient dans un script, ce dernier doit commencer par : #include "nom_donné_au_script_inclus"

4. Le script

/*-----------------------------------------------------------------------------
Conditions sur le Passage de Niveau
------------------------------------------------------------------------------*/
///////////////////////////////////////////////////////////////////////////////
//Interface
///////////////////////////////////////////////////////////////////////////////

//A placer dans l'event onLevelUp du module
//Verifie si un joueur qui vient de passer de niveau etait autorise
//a gagner un niveau dans la classe ou il est passe
//Si ce n'est pas le cas, annule le passage de niveau ;
//Si c'est le cas reinitialise les variables pour le prochain niveau
//sMessage sera envoye au joueur s'il passe de niveau dans une
//classe non autorisee
void CheckClassLevelled (string sMessage = "Vous n'avez pas
ete forme pour passer de niveau dans cette classe.");

//Autorise oPC a passer de niveau dans une classe CLASS_TYPE
//sMessage est envoye au joueur pour le prevenir
void EnableLevelling (int CLASS_TYPE, object oPC, string sMessage = "Vous pouvez maintenant passer de niveau dans la
classe pour laquelle vous avez ete forme");

//Empeche oPC de passer de niveau dans une classe CLAS_TYPE
void DisableLevelling (int CLASS_TYPE, object oPC, string sMessage = ");

//Retourne le nombre d'xp necessaire pour atteindre le niveau Level
int GetNextLevelExp(int Level);

//Retourne le niveau global de oPC (cumul de toutes ses classes)
int GetTotalLevel(object oPC);

//Verifie si oPC a assez d'xp pour passer de niveau
//retourne TRUE si c'est vrai, FALSE si c'est faux
int CheckXP(object oPC);

//Verifie si oPC a assez d'xp pour passer de niveau
//Si oui, sMessage est envoye a oPC pour l'informer des
//conditions de passage de niveau
void OptionCheckXP(object oPC,string sMessage="Avant de pouvoir passer de niveau,
vous devez suivre l'entrainement approprie");

///////////////////////////////////////////////////////////////////////////////
// Les Nouvelles fonctions
///////////////////////////////////////////////////////////////////////////////

void CheckClassLevelled (string sMessage){
//definir oPC comme etant le joueur qui vient de passer de niveau
object oPC = GetPCLevellingUp();
//Verifier que le joueur soit passe de niveau dans une classe pour
//laquelle il remplit les conditions
int iClass = 0;
while (iClass < 11) {
//Si il est passe de niveau dans une classe non autorisee
if ( GetLocalInt(oPC,"OldClass"+IntToString(iClass)) < GetLevelByClass(iClass,oPC)
&& GetLocalInt(oPC,"Class"+IntToString(iClass)+"Allowed")==0 ){
//Retenir le total de points d'experience de oPC au moment
//du passage de niveau
int StoredXP = GetXP(oPC);
//le ramener au niveau/classe precedant le passage de niveau
SetXP(oPC,GetNextLevelExp(GetTotalLevel(oPC)-1)-1);
//l'informer qu'il n'est pas passe de niveau dans la bonne classe
SendMessageToPC(oPC,sMessage);
AssignCommand(oPC,ClearAllActions());
SetXP(oPC,StoredXP);}
//Si tout se passe bien reinitialiser les conditions pour le prochain niveau
else DisableLevelling (iClass,oPC);
iClass++; }
}


void EnableLevelling (int CLASS_TYPE, object oPC,string sMessage){
//Retenir les niveaux de oPC dans chaque classe
int iClass = 0;
while (iClass < 11) {
SetLocalInt(oPC,"OldClass"+IntToString(iClass),GetLevelByClass(iClass,oPC));
iClass++; }
//Autoriser le passage de niveaux dans la classe CLASS_TYPE
SetLocalInt(oPC,"Class"+IntToString(CLASS_TYPE)+"Allowed",1);
//Informer le joueur
SendMessageToPC(oPC,sMessage); }

void DisableLevelling (int CLASS_TYPE, object oPC,string sMessage){
//Empecher le passage de niveaux dans la classe CLASS_TYPE
SetLocalInt (oPC,"Class"+IntToString(CLASS_TYPE)+"Allowed",0);
SendMessageToPC(oPC,sMessage); }


int GetNextLevelExp(int Level) {
int Exp = 0;
int i = 1;
while (i Exp ) {
SendMessageToPC(oPartyMember,sMessage); }
oPartyMember = GetNextFactionMember(oPC, TRUE); }
}

int CheckXP(object oPC){
int TotalLevel = GetTotalLevel(oPC);
int Exp = GetNextLevelExp(TotalLevel);
if ( GetXP(oPC) > Exp ) return TRUE;
return FALSE; }



Utilisation: Pour utiliser les fonctions de ce script dans un module :

1) Créer un nouveau module avec le ToolSet ou en ouvrir un existant pour le modifier.

2) Ouvrir le Script Editor (Rubrique Tools de la barre d'outil).

3) Recopier le script ci-dessus et enregistrer le sous le nom de votre choix (préférablement facile a retenir, genre :levelup_include)

4) Dans les proprietes du modules (Rubrique Edit de la barre d'outil), onglet Events, éditer le OnLevelUp event :
#include "levelup_include"
void main()
{
CheckClassLeveled("Message que vous voulez envoyer au joueur quand il essaie
de passer de niveau dans une classe pour laquelle il ne remplit pas les conditions");
}


Note: Par defaut le joueur ne peut passer de niveau dans aucune classe.

5 ) Pour autoriser un joueur a passer de niveau dans une classe, il suffit d'utiliser la fonction EnableLevelling (int CLASS_TYPE, object oPC, string sMessage)
Par exemple pour autoriser un personnage a passer un niveau de guerrier après avoir parler à Gunther le Maître d'Arme du coin, il suffit de placer dans l'onglet ActionTaken
du noeud de la conversation où vous voulez que ça se passe :
#include "levelup_include"
void main()
{
EnableLevelling(CLASS_TYPE_FIGHTER, GetPCSpeaker(), "Vous pouvez progresser dans la classe de guerrier!");
}


6) Pour empêcher un joueur a passer de niveau dans une classe, il suffit d'utiliser la fonction DisableLevelling (int CLASS_TYPE, object oPC, string sMessage)
Par exemple, dans le module tout le monde peut passer de niveau comme il veut. Mais si un PC paladin tue Lili la gentille petite fille du coin, il ne pourra plus gagner de niveau de paladin. Il suffirait de placer dans le onDeath event de Lili :
#include "levelup_include"
void main()
{
DisableLevelling(CLASS_TYPE_PALADIN, GetLastKiller(),"Après un telle ignominie, n'espérez plus pouvoir
continuer dans la voie du paladin!");
}


7) CheckXP(object oPC) Pour vérifier si le joueur a assez de points d'experience pour passer de niveau avant de lui offrir la possibilité de remplir les conditions nécessaires au passage de niveau... hmm ce sera plus clair avec un exemple
Gunther (notre fameux maître d'arme de tout à l'heure) ne propose au joueur de l'entraîner que si le joueur a assez de points d'experience pour gagner un niveau. Dans l'onglet Starting Conditional du noeud de la conversation où Gunther propose l'entraînement :
#include "levelup_include"
void main()
{
CheckXP(GetPCSpeaker());
}


8) Optionnel et non testé: prévenir le joueur des conditions générales de passage de niveau du module lorsqu'il atteint le nombre d'xp nécessaire pour passer au niveau supérieur.
Ajouter a tous les onDeath script (le plus simple est de l'ajouter au script par défaut du module) tout en haut du script (avant void main() ) #include levelup_include
et tout en bas du script (juste avant la derniere } ) OptionCheckXP(GetLastKiller(),"message que vous souhaitez envoyer au joueur"); Puis dans le reste du module à chaque fois que vous utilisez l'une des fonctions GiveXPToCreature ou SetXP, ajoutez tout en haut du script #include levelup_include et ajoutez OptionCheckExp(objet_dont_les_xp_ont_ete_modifiés) la ligne suivant celle ou ont été modifiés les xp.



Salut Kemay, ton script est très intéressant, j'aimerais l'utiliser dans mon module.
Mais j'ai un petit problème :
j'ai créé Gunther le maître d'arme et je lui ai mis le script pour la class fighter, quand le joueur essaye de monter de niv dans une différentes classes, cela rabaisse donc le niv du joueur et lui donne le niv 0 dans cette classe:ex: le joueur veux passer un niv en druid, cela ne marche pas et donne niv 0 en druid en plus du niv 1 en fighter. Ensuite le joueur ne peux plus monter de niv, l'exp monte mais on ne peux pas levelup.

Si quelqu'un à une idée, merci d'avance :merci:

Par mobidique le 5/9/2002 à 10:34:36 (#2099867)

Déplacer tous les joueurs d'une area à une autre en une seule fois.

Voici le script :

void main()
{
// Get the destination waypoint object.
object oDestination = GetWaypointByTag("WP_CaverneFermee");
// Select the first member of the party.
object oFM = GetFirstFactionMember(GetFirstPC());
// Set up a variable to use for party member current area.
//object oFMArea;
// Step through the party members.

while(GetIsObjectValid(oFM))
{
// Play the summon monster 3 animation
// effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3);
// AssignCommand(oFM, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oFM));
// Jump to Destination Waypoint after a 2 second delay to watch the animation.
// AssignCommand(oFM, DelayCommand(2.0 , JumpToObject(oDestination)));
AssignCommand(oFM, JumpToObject(oDestination));
// SendMessageToPC(oFM, "You have arrived!");
// Select the next member of the faction and loop.
oFM = GetNextFactionMember(oFM);
}
}


C'est un script que j'ai repompé sur les forum bioware. J'ai laissé ici tout le code dont je n'avais pas besoin. Ce code me laisse supposer que ce qui était envisagé par le codeur était un vrai script de téléportation avec effet magique visuel et comme je me souviens que quelqu'un a été demandeur à une époque ...

Perso j'ai utilisé ce script de la manière suivante. Je voulais simuler un éboulement dans une caverne coupant défintivement les avanturiers de leur chemin d'accés ... J'ai donc fait une zone de trois tiles je crois avec une entrée au sud et une sortie à l'ouest. Une fois satisfait de cette zone à tout point de vue (son, lumière, apparence) j'en ai fait une copie. La première area était AVANT l'éboulement la seconde devait être APRES l'éboulement. Dans cette seconde area je pète la porte, je place des boulders des débris des garbage et pas mal de dust plume. Ensuite je choisis parmi les sons dispo un truc un peu stressant que je fais démarer dés l'entrée des perso dans la zone, c'est ç dire délay 0 dans les proprités de l'area. Enfin j'ajoute le plus gros son d'éboulement que j'ai à ma dispo et je le fais également jouer à l'entrée des persos. Je place mon waypoint d'arrivée face orientée vers l'éboulement. Dernière petite touche : à force de tester et retester mon effet et faire de l'autosatisfaction facilen je me rend compte d'une chose. les perso vont avoir un écran de chargment court certes mais écran quand même ... D'où une éventuelle confusion avec une téléportation justemment ... Je me suis dit alors qu'il fallait dans l'environement un éléments stable et imméditament reconnaissable et identifiable sans ambiguité. Dans le contexte de mon module j'ai choisi une defaced statue avec un code associé sur le OnUsed qui fait apparaitre un petit texte décrivant la statue ... la statue est immédiatement reconnaissable et le petit texte qui apparait aussi bien avant qu'aprés l'éboulement assure la continuité entre les 2 zones.

En pratique ça donne ça ... Les joueurs passent la porte descendent dans la cave ... l'un des joueurs va se diriger vers la sortie ouest qui a lui se présente comme une area transition. Sur le chemin il passe sur un trigger qui déclenche le script présenté ci dessus. Tous les joueurs sont transportés dans l'area APREs éboulement. Ils sont matérialisé orienté vers la partie éboulée. Les son d'éboulement se fait entendre, les dust plume commencent à cracher leur poussière et ce mouvment donne presque l'illusion de voir la fin de l'éboulement et enfin la petite musique stressante commence ...

En pratique la première fois que j'ai fait jouer ça tous les joueurs ne sont pas arrivé en même temps pour cause de connection pourrie ... du coup le dernier arrivée n'a pas eut le son de l'éboulement en plus les autres étaient déjà prêt à partir (oui un ping VRAIMENT pourri) c'était dommage. Mais la seconde fois c'était parfais :)

Simple et de bon gout ;)

Mob'.

EDIT :
On vient de porter à ma connaissance les effets suivants :

ApplyEffectAtLocation ( DURATION_TYPE_INSTANT,
EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), lTargetLoc);
ApplyEffectAtLocation ( DURATION_TYPE_INSTANT,
EffectVisualEffect ( VFX_FNF_SCREEN_BUMP), lTargetLoc));


ça peut être rigolo à ajouter ...

Gestion des flags dans un module solo/semi-permanent

Par Tyn' le 22/9/2002 à 21:00:28 (#2212786)

//::///////////////////////////////////////////////
//:: Gestion des flags pour modules solo/semi-permanent
//:: at_flags.nss
//:: Copyright (c) Althea 2002
//:://////////////////////////////////////////////
/*
Bibliotheque de fonction gerant les flags
(variables concernant le joueur) de facon
dynamique, pour eviter qu'ils soyent perdu
en cas de deconnection.
*/
//:://////////////////////////////////////////////
//:: Créé par : Tynril
//:: Créé le : 22/09/2002
//:://////////////////////////////////////////////

//:://////////////////////////////////////////////
//:: DECLARATION DES FONCTIONS
//:://////////////////////////////////////////////
// Recupere le nom d'une variable flaguee
string GetFlagName(object oJoueur, string sFlag);
// Cree un flag de type Float
void SetFlagFloat(object oJoueur, string sFlag, float fValeur);
// Cree un flag de type Int
void SetFlagInt(object oJoueur, string sFlag, int nValeur);
// Cree un flag de type Location
void SetFlagLocation(object oJoueur, string sFlag, location lValeur);
// Cree un flag de type Object
void SetFlagObject(object oJoueur, string sFlag, object oValeur);
// Cree un flag de type String
void SetFlagString(object oJoueur, string sFlag, string sValeur);
// Recupere un flag de type Float
float GetFlagFloat(object oJoueur, string sFlag);
// Recupere un flag de type Int
int GetFlagInt(object oJoueur, string sFlag);
// Recupere un flag de type Location
location GetFlagLocation(object oJoueur, string sFlag);
// Recupere un flag de type Object
object GetFlagObject(object oJoueur, string sFlag);
// Recupere un flag de type String
string GetFlagString(object oJoueur, string sFlag);

//:://////////////////////////////////////////////
//:: ENREGISTREMENT DES FONCTIONS
//:://////////////////////////////////////////////
// Recupere le nom d'une variable flaguee
string GetFlagName(object oJoueur, string sFlag)
{
//Verification des informations fournies
string sReturn;
if(GetIsPC(oJoueur) && sFlag != ")
{ //Execution du script
//Recuperation des informations du joueur
string sPlayerName = GetPCPlayerName(oJoueur);
string sName = GetName(oJoueur);
string sPublicKey = GetPCPublicCDKey(oJoueur);
//Definition de la valeur
sReturn = sPlayerName+sPublicKey+sName+sFlag;
}else{ //Retour d'une erreur
//Definition de la valeur
sReturn = "ERREUR DANS L'APPEL DE LA FONCTION GetFlagName";
}
//Renvoit de la valeur
return sReturn;
}

// Cree un flag de type Float
void SetFlagFloat(object oJoueur, string sFlag, float fValeur)
{
SetLocalFloat(GetModule(), GetFlagName(oJoueur, sFlag), fValeur);
}

// Cree un flag de type Int
void SetFlagInt(object oJoueur, string sFlag, int nValeur)
{
SetLocalInt(GetModule(), GetFlagName(oJoueur, sFlag), nValeur);
}

// Cree un flag de type Location
void SetFlagLocation(object oJoueur, string sFlag, location lValeur)
{
SetLocalLocation(GetModule(), GetFlagName(oJoueur, sFlag), lValeur);
}

// Cree un flag de type Object
void SetFlagObject(object oJoueur, string sFlag, object oValeur)
{
SetLocalObject(GetModule(), GetFlagName(oJoueur, sFlag), oValeur);
}

// Cree un flag de type String
void SetFlagString(object oJoueur, string sFlag, string sValeur)
{
SetLocalString(GetModule(), GetFlagName(oJoueur, sFlag), sValeur);
}

// Recupere un flag de type Float
float GetFlagFloat(object oJoueur, string sFlag)
{
return GetLocalFloat(GetModule(), GetFlagName(oJoueur, sFlag));
}

// Recupere un flag de type Int
int GetFlagInt(object oJoueur, string sFlag)
{
return GetLocalInt(GetModule(), GetFlagName(oJoueur, sFlag));
}

// Recupere un flag de type Location
location GetFlagLocation(object oJoueur, string sFlag)
{
return GetLocalLocation(GetModule(), GetFlagName(oJoueur, sFlag));
}

// Recupere un flag de type Object
object GetFlagObject(object oJoueur, string sFlag)
{
return GetLocalObject(GetModule(), GetFlagName(oJoueur, sFlag));
}

// Recupere un flag de type String
string GetFlagString(object oJoueur, string sFlag)
{
return GetLocalString(GetModule(), GetFlagName(oJoueur, sFlag));
}
J'espère que ça pourra vous être utile :)

vider inventaire, activer rencontre

Par Florynth le 26/9/2002 à 13:02:12 (#2235501)

À la demande de Delis je recopie deux scripts dans cette section et je corrige un petit détail que j'ai remarqué du même coup...


vider inventaire et equipement...
Comme j'ai chercher longtemps comment faire et je crois avoir trouver une bonne façon de le faire et bien je vous donne mon script (j'ai été chercher une partie a cette page http://forums.jeuxonline.info/newth...read&forumid=28 , mais j'ai optimisé un peu dans une boucle c'est moins chiant)


//Vide l'inventaire de la cible et la met dans le contenant
//Si pas de contenant specifier, detruit tout simplement

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 10)
activeRencontreAraigne(TRUE);
else
activeRencontreAraigne(FALSE);
}
}

void activeRencontreAraigne(int true_false)
{
int i;
for(i = 0 ; i < 4 ; i++){
SetEncounterActive(true_false,GetObjectByTag("friz_encou_arai1",i));
}
}



Dans ce cas mes rencontre son "friz_encou_arai1", j'en ai créé 4, donc que je doit activer...

Bien entendu il faut savoir si l'araigné reine est en vie...
dans son onSpawn on créé une variable "araigneReineVie" dans l'area qu'on mait a TRUE , et lorsque que l'araigné meurt on mais cette valeur a FALSE

Si vous avez des questions n'hésitez pas...

Par halaster le sombre le 30/9/2002 à 16:29:38 (#2259948)

J'ai utiliser ce script dans un module ou on débute dans une prison... j'ai mis cette appel dans le onEnter de la zone (area) faites attention de vérifier quel personnage et quand vous voulez qu'il le fasse


Ca ne marche pas, quand je teste le module avec un de mes personnage il garde toujours son équipement :sanglote: . Pourtant j ai bien mis ce script dans le OnEnter de la premiere Area, celle ou débute l'aventure. Pourquoi ?? :confus:

Script du onEnter

Par Florynth le 1/10/2002 à 4:31:59 (#2263205)

Je te donne le script que j'ai mis dans le onEnter de ma zone ou il y a la prison... les deux scripts (pour l'inventaire et les combats d'araignés) sont présents dans cet epel...



void main()
{
object personnage = GetEnteringObject();
// La premiere fois q'un personnage entre, donc le debut du module
if (GetIsPC(personnage))
if(GetLocalInt(OBJECT_SELF,"entrer") != 1)
{
SetLocalInt(OBJECT_SELF,"jour entrer",GetCalendarDay());
viderInventaire(personnage,GetObjectByTag("CoffreEquipement"));
activeRencontreAraigne(FALSE);
SetLocalInt(OBJECT_SELF,"entrer",1);
// Les autre fois
}else{
int jourEntrer = GetLocalInt(OBJECT_SELF,"jour entrer");
int aujourdhui = GetCalendarDay();
if(GetLocalInt(OBJECT_SELF,"araigneReineVie") == TRUE && (aujourdhui - jourEntrer) > 10)
activeRencontreAraigne(TRUE);
else
activeRencontreAraigne(FALSE);
}
}



Il faut vérifier avec getEnteringObject si c'est un joueur car l'inventaire de tout les créatures sera vider... et tu doit exécuter se script seulement a un moment précis (dans ce cas la première fois qu'il entre dans la zone) car sinon il videra sont inventaire tout le temps... et pour ce qui est de la sauvegarde de la date c'est pour mes combats contre les araignés... j'espère que ça ta aider...

p.s. : je te met le script si du onEnter de la zone si tu veux que tout les personnage joueur soit vider à chaque fois qu'il entre dans la zone



void main()
{
object personnage = GetEnteringObject();
if (GetIsPC(personnage))
viderInventaire(personnage);// ici comme aucun objet contenant est spécifier le contenu de l'inventaire est simplement détruit..,
}

Le seul Post qui N apporte pas de solution :p (erf vi desolé)

Par durite le 11/10/2002 à 20:37:59 (#2319259)

Bonsoir a vous , j ai parcouru le jeu ( en tant que joueur) et ai été temoin d Un grand nombre de scenes que je qualifierai presques de cinematiques maice qui me pousse a croire que les gens de chez Bioware on deja inclus les scripts dnas le jeu.

pour etre plus claire voici un exemple :

je rentre dans une piece , et je vois Un PNJ invoquer des monstres , dire quelque chose et faire un sort qui le fait disparaitre ( ou bien il s enfuit et disparait )

c est bien joli mais je dois pouvoir trouvé ce script en préréalisé dans le jeu non ?

autre exemple : a la mort d un Monstre S ouvre un portail menant dans une autre zone (vu a la fin du jeu)

Ya ti pas moyen de pomper ce script a partir de la base de donnée du jeu ?

enfin vala , j vois plein de choses tres interessantes sur ce post , plein de chose a tomber par terre dans le jeu , mais nulle part une sorte de dico repertoriant les scripts du jeu d origine et leur effet :/

c est tres frustrant d etre nul en scipting , d avoir un jouet super joli mais sans la notice qui permet de faire autre chose que des monstres , des decors , et...des monstres :p

merci d avance pour vos infos

Par Daynos le 12/10/2002 à 16:29:01 (#2323040)

Je ferme ce sujet pour l'instant. J'explique pourquoi ici :

http://forums.jeuxonline.info/showthread.php?s=&threadid=127079

JOL Archives 1.0.1
@ JOL / JeuxOnLine