Scripting Tutorial: Defining An Object
Tutorial de Script : Définir un Objet
par David Gailer
Cet article est un peu plus compliqué... mais je me suis trouvé assez souvent devant cet obstacle avant d'arriver à faire quelque chose.
La plupart des actions ont besoins d'un objet comme cible. La façon la plus facile de décrire un objet et d'avoir son Tag a portée de main... ce qui serait bien c'est que vous sachiez ou va la cible de l'objet. Mais quand on ne sait pas? Comment trouver le PJ le plus proche... lequel est ce que cela pourrait être? Que faire si vous voulez cibler la créature la plus proche? Comment vous faites pour vérifier a quelle distance et quelque chose au loin?
Il y a plusieurs façons de vérifier de telles choses... Ici , je vais me concentrer sur trois d'entre elles : GetNearestCreature, GetNearestObject et GetDistanceBetween.
GetNearestCreature
Cette commande vous permet de trier des créatures en fonctions de leur proximité par rapport a l'objet en fonction de 3 paramètres. Notez que la cible n'est pas obligatoirement la première du type trouvé... c'est simplement le résultat par défaut. Si vous vouliez localiser le rogue humain PNJ le deuxième plus proche par exemple, c'est la commande que vous utiliseriez.
La syntaxe est de ce type :
object GetNearestCreature (int
nFirstCreatureType, int nFirstParameter,
object oTarget=OBJECT_SELF,
int nNth=1,
int nSecondCreatureType = -1,
int nSecondParameter = -1,
int nThirdCreatureType = -1,
int nThirdParameter = -1 )
C'est peut être un peu confus, mais regardons pas a pas.
nFirstCreatureType et nFirstParameter sont les critères initiaux que vous cherchez. Imaginons que vous cherchiez seulement l'Humain le plus proche... nFirstCreatureType serait l'attribut CREATURE_TYPE_ RACIAL_TYPE, et nFirstParameter serait RACIAL_TYPE_HUMAN.
Comprenez vous? Vous avez trois critères pour affiner votre recherche... chacun requièrt un attribut et un paramètre.
L'objet oTarget est, bien sûr, ce que la créature recherche de plus proche. Cela peut être OBJECT_SELF (et c'est le cas par défaut) pour cherchez à proximité de celui qui utilise le script. Vous pourriez aussi faire quelque chose de génial en vérifiant la créature la plus proche du PJ le plus proche... mais je ne veux même pas l'écrire.
L'entier nNth est ce que vous employez pour déterminer si vous employez le premier plus proche ou un autre. Par défaut, c'est le plus proche... mais tout nombre que vous indiquerez ici déterminera le nombre de créatures, les plus proches, qui seront recherchées. Noter que n'importe qu'elle fonction peut être employée ici, à condition qu'elle renvoie un nombre entier... vous pouvez mettre d4()
, par exemple, si vous voulez déterminer aléatoirement entre le premier et le quatrième proche.
Voici donc une liste de type de créature que vous pouvez assortir:
- CREATURE_TYPE_CLASS = classe de monstre ou de joueur
- CREATURE_TYPE_DOES_ NOT_HAVE_SPELL_EFFECT = si vous cherchez une créature spécifique qui n'a pas de sort sur lui (référencé par la constante SPELL_*)... J'imagine que ça ne doit pas arriver souvent.
- CREATURE_TYPE_SPELL_EFFECT = l'opposé du précèdent, bien sûr... cherche une créature avec un sort particulier sur lui. Notez que tout les effet des sorts ne sont considérés en tant que tels.
- CREATURE_TYPE_IS_ALIVE = explicite, si vous voulez éliminer les morts.
- CREATURE_TYPE_PERCEPTION = ce n'est pas techniquement un attribut de la créature mais plutôt de le nature de la perception par rapport à l'objet visé... comme s'il pouvaient être vu ou entendus.
- CREATURE_TYPE_PLAYER_CHAR = ceci détermine si la créature est un joueur ou non.
- CREATURE_TYPE_RACIAL_TYPE = race de la créature
- CREATURE_TYPE_REPUTATION = classement d'après le niveau de réputation de la faction de la cible.
Je ne passerai pas en revue toutes les classes, races et effets particuliers qui peuvent être employés puisqu'ils
sont assez évidents. Par contre, d'autres le sont moins.
CREATURE_TYPE_IS_ALIVE :
CREATURE_TYPE_PERCEPTION :
- PERCEPTION_HEARD
- PERCEPTION_HEARD_AND_NOT_SEEN
- PERCEPTION_NOT_HEARD
- PERCEPTION_NOT_SEEN
- PERCEPTION_NOT_SEEN_ AND_NOT_HEARD
- PERCEPTION_SEEN
- PERCEPTION_SEEN_AND_HEARD
- PERCEPTION_SEEN_ AND_NOT_HEARD
CREATURE_TYPE_PLAYER_CHAR :
- PLAYER_CHAR_IS_PC
- PLAYER_CHAR_NOT_PC
CREATURE_TYPE_REPUTATION :
- REPUTATION_TYPE_ENEMY
- REPUTATION_TYPE_FRIEND
- REPUTATION_TYPE_NEUTRAL
Donc... comment je trouve le PJ le plus proche de moi?
GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC );
Le magicien ennemi le plus proche?
GetNearestCreature( CREATURE_TYPE_ REPUTATION, REPUTATION_ENEMY, OBJECT_SELF, 1,
CREATURE_TYPE_CLASS, CLASS_TYPE_WIZARD );
L'ennemi en vie le plus proche de l'allié de mon PJ?
GetNearestCreature( CREATURE_TYPE_ REPUTATION, REPUTATION_ENEMY, GetNearestCreature( CREATURE_TYPE_ PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, 1, CREATURE_TYPE_ REPUTATION, REPUTATION_FRIENDLY ), 1, CREATURE_TYPE_ IS_ALIVE, TRUE );
Le plus proche que je puisse voir?
GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, OBJECT_SELF, 1, CREATURE_TYPE_ PERCEPTION, PERCEPTION_TYPE_ SEEN );
GetNearestObject
Ceci est beaucoup moins compliqué parce que vous pouvez seulement associer des objets par leur type... vous n'avez pas les caractères multiples des créatures. Autrement cela fonctionne plus ou moins de la même manière.
object GetNearestObject (int
nObjectType=OBJECT_TYPE_ALL,
object oTarget=OBJECT_SELF,
int nNth=1)
nObjectType est, évidemment, le type d'objet que vous recherchez. Si vous n'indiquez rien ce sera l'objet de n'importe qu'elle sorte le plus proche.
nNth est l'entier qui vous permet d'aller au dela du plu proche... un nNth de 3 chercera le troisième plus proche par exemple.
Les types d'objets sont :
- OBJECT_TYPE_ALL
- OBJECT_TYPE_AREA_OF_EFFECT
- OBJECT_TYPE_CREATURE
- OBJECT_TYPE_DOOR
- OBJECT_TYPE_INVALID
- OBJECT_TYPE_ITEM
- OBJECT_TYPE_PLACEABLE
- OBJECT_TYPE_STORE
- OBJECT_TYPE_TRIGGER
- OBJECT_TYPE_WAYPOINT
GetDistanceBetween
Ceci rapporte la distance (en mètres) entre deux objets valides. Il est important que les deux objets soient valides, sinon la distance reçue sera 0.
float GetDistanceBetween(
object oObjectA,
object oObjectB)
(Qu'est ce qu'un float, d'ailleurs? Un float, comme un integer, est juste un nombre... mais un float a toujours des décimales. '50' sera un integer (entier)... '50.0' sera un float. Si vous en avez besoin, vous pouvez utiliser la commande int FloatToInt( float fFloat )
pour convertir un float en entier; [nota: un float est un réel , un entier est un entier cf Cours de Maths) .
Si vous vérifiez simplement à quelle distance est quelque chose de la créature ou de l'objet qui lance le script, il est plus facile d'utiliser cette commande :
float GetDistanceToObject(
object oObject )
De cette façon vous ne devez pas indiquer constamment OBJECT_SELF dans la commande GetDistanceBetween.