Scripting Tutorial: Sitting In Chairs and Sleeping
Tutorial de Script : s'asseoir dans les fauteuils et dormir
Par David Gaider
Comment faire pour que mon PJ s'assoie sur une chaise ?
Il n'y a pour le moment aucun emote pour s'asseoir. En attendant qu'ils soient ajoutés aux caractères des PJs, le script pour faire s'asseoir un personnage doit être sur l'objet, lui-même.
Si vous posez une chaise usuelle plaçable (la chaise a la case Useable box cochée, et assurez vous que le PJ aura la place de manier la chaise pour s'asseoir), mettez ce script dans l'événement OnUsed du volet script:
void main()
{
object oChair = OBJECT_SELF;
if(!GetIsObjectValid( GetSittingCreature(oChair)))
{
AssignCommand(GetLastUsedBy(), ActionSit(oChair));
}
}
Quand je place une créature dans la zone il reste debout. N'y a-t-il a aucun moyen de les faire s'asseoir ?
Non, dans le toolset, non... la créature doit rester debout. La créature devrait être scriptée de sorte que lorsque le jeu commence elle trouve une chaise et exécute la commande ActionSit
.
Créez une chaise et donnez lui le tag "CHAIR". Placez le PNJ près de la chaise. Copiez et sauvegardez leur script OnSpawn sous un autre nom, et ajoutez la ligne ci dessous:
ActionSit( GetNearestObjectByTag( "CHAIR", OBJECT_SELF ));
Notez que quand un PJ parlera aux PNJs, il se lèveront. Pour les faire se rasseoir, vous devrez allez dans l'onglet Other Files de leur dialogue. Vous verrez l'emplacement pour deux scripts, un lorsque le dialogue commence et l'autre qand il se termine ou est annulé. Faites un script qui appelle la ligne ci-dessus et ils se rassoiront lorsque le dialogue sera terminé.
C'est bien mais si je veux que le PNJ soit déjà assis dans le tileset ?
Des utilisateurs ont eu du succès en utilisant la méthode ci-dessus... mais en mettant un objet placeable invisible object placé sur le siège de la chaise. Donnez le tag "CHAIR" à l'objet et utilisez la même ligne ActionSit
et ils s'assiéront de la même manière qu'au dessus.
Si je veux que mon PNJ dorme sur un lit?
Il n'y a actuellement aucune manière de placer un PNJ dans un lit ou dans un lit d'un tileset. Un objet placeable peut être mis dans un lit mais pas une créature.
Une créature peut cependant dormir sur un objet bedroll ou par terre. Si vous voulez que le PNJ commence le jeu en dormant, vous devriez copier le script OnSpawn, le sauver sous un nom différent, et ensuite ajouter ceci en haut du script :
effect eLieDown = EffectSleep();
effect eSnore = EffectVisualEffect (VFX_IMP_SLEEP);
effect eSleep = EffectLinkEffects (eLieDown, eSnore);
ApplyEffectToObject (DURATION_TYPE_PERMANENT, eSleep, OBJECT_SELF);
<
br />
Réveiller votre PNJ
Si vous voulez que votre PNj se réveille à un certain moment, vous devrez utilisez la commande RemoveEffect
. Un effet, une fois appliqué, ne peut pas avoir une variable définie comme EffectSleep
, et être désactivé par cette commande. Le pointeur doit être sur cet effet particulier. Si l'effet correspond à la même variable dans le même script que quand il est utilisé, vous pouvez simplement utiliser ceci :
RemoveEffect( OBJECT_SELF, eSleep);
Normalement, vous devrez cependant chercher parmi les effet d'objets et trouvez celui que vous cherchez parmi les autres. Ce qui suit est un script simple pour enlever l'effet sleep (il est dans le OnHeartbeat de la créature et la réveille si un hostile approche a moins de 5m) :
#include "NW_I0_GENERIC"
void main()
{
if (GetHasEffect( EFFECT_TYPE_SLEEP))
{
object oTarget = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY);
if ( ( GetDistanceToObject( oTarget ) < 5.0) && ( GetIsObjectValid( oTarget ) ) )
{
effect eSleep = GetFirstEffect( OBJECT_SELF );
while ( GetIsEffectValid( eSleep ) )
{
if ( ( GetEffectType( eSleep ) == EFFECT_TYPE_SLEEP ) && ( GetEffectSpellId( eSleep ) != SPELL_SLEEP ) )
{
RemoveEffect( OBJECT_SELF, eSleep );
}
eSleep = GetNextEffect( OBJECT_SELF );
}
}
}
}