Arme pnj

Répondre
Partager Rechercher
Bonjour, apres vous avoir longtemps laissé tranquille, je reviens vous embéter un peu avec une question

Comment faire pour qu'un pnj n'utilise QUE l'arme dont il est équipé au moment ou il spawne (celle mis dans l'éditeur)
En effet j'ai des pnj ayant de l'équipement dropable mais qu'il ne doivent pas utiliser.
D'avance merci pour vos réponses
Il me semble que les PNJ utilisent n'importe quelle arme de leur inventaire, mais en général toujours la plus puissante ou la plus efficace.

En mettant dans l'inventaire du PNJ des armes moins puissantes il ne devrait donc pas les utiliser, sauf si les attaques sont inefficaces, il testera chaque arme. Tout ceci, d'après ce que j'ai pu constater, je ne sais pas du tout si c'est le cas et je ne peux pas essayer là, de suite.
oui... je pense que la créature est pas stupide et qu'elle utilise l'arme la plus puissante pour elle...
Mais en faite cet inventaire est destiné à des drops aléatoires pour les pj's, donc la créatures est pas censé utiliser des armes qu'elle a pas forcément (le script gere ça sur un jet dé à la mort).
Si la créature utilise une arme qu'elle n'a pas en inventaire dans le toolset... c'est que tu a un soucis avec ce script de création d'arme et qu'il ne se lance pas à la mort de la créature, ou que tu a un autre script qui te crée des armes au spawn?

- Vérifie dans le toolset que son inventaire est vide
- Lance le module
- Prends possession de la créature quand elle spawn et vérifie son inventaire
- Tue là et regarde le drop

En tout cas, une créature ne peux pas utiliser une arme qu'elle n'a pas en inventaire.
En faite, pour que ce script fonctionne, il faut que les item soient présent dans l'inventaire de la créature. A la mort de cette dernière, un jet en % est effectué sur chaque item pour voir s'il drop ou non.
D'ou le fait que l'inventaire soit rempli au spawn de la créature.
Dans ce cas, la seule solution à ton problème et soit de mettre des objets à looter que les créatures ne pourront pas utiliser, soit de stocker ces objets ailleurs (un coffre inaccessible sur une carte, ou dans les Limbes, par exemple).

Le second choix implique de revoir ton procédé, et donc ton script, mais qui, je crois, peut s'avérer très intéressant si tu gères un grand nombre de créatures (blueprint) différentes.

Sinon, peut être en retravaillant les scripts d'IA des créatures... mais bof, je ne saurais que le déconseiller.
A mon sens le plus simple serait de faire ainsi:

- Créature avec inventaire vide (il n'utilisera donc que l'arme que tu lui auras assigné soit en main principale, soit en inventaire)
- Script personnalisé OnDeath (évènement déclenché lors de la mort de la créature)
Je n'ai pas l'éditeur ouvert, mais grossomodo sa donnerait ça

Code PHP:

object oMort OBJECT_SELF;
aleatoire Random(3)+1;  // mettre le nombre d'items dropables en aléatoire lors de la mort de la créature dans les parenthèses du random.

if (GetIsDead(oMort) && GetIsOBjectValid(oMort))
{
switch(
aleatoire)
{
case 
01:
CreateItemOnObject(oMort"resref de l'item 1");
break;
case 
02:
CreateItemOnObject(oMort"resref de l'item 2");
break;
case 
03:
CreateItemOnObject(oMort"resref de l'item 3");
break; 
// etc...
}

Si tu as besoin d'une solution rapidement, celle d'Elandir est faite pour toi. L'avantage c'est que tu ne créé l'objet que lorsque tu le drop au contraire de ton script précédent -> moins de mémoire occupée.
Le désavantage c'est que la mort de créature provoquera un pic CPU causé par la création d'item (plus il y a de drop plus le pic sera grand/long, une tempête de feu sur un groupe de gobelins qui drop...).

Si tu as besoin d'un solution plus costaud (module multi par exemple) oriente-toi plutôt vers le système de C.Duk. Cette solution pourrait reprendre le principe du Pool : une base d'items déjà créés que tu copie lorsque c'est nécessaire.
L'avantage c'est que tu n'as plus le désavantage cité au-dessus, que tu utilises une copie d'objet plutôt qu'une création, et probablement d'autres que je ne vois pas sur le coup.
Le désavantage c'est que ça demande plus de boulot.
Merci El@ndir, je vais tester ça en m'attachant à ce qu'à écrit Lv4. Mon server est effectivement à vocation multi, mais les pics de joueurs sont rares j'avoue, et les créatures concernées par ce script très peu nombreuses elles aussi.

Sinon, je m'orienterai vers ce que propose C.Duk -> en clair les objets sont déjà crées et un script va "chercher" ceux droper en les "copiant" dans l'inventaire de la créature - j'ai bon là?
Bon par contre là pour le dit-script j'aurai besoin d'aide
Oui tu as bien compris l'idée, et grosso-modo, voilà ce que ça pourrait donner:
Code PHP:

object oDead OBJECT_SELF;

string sVault "tagducoffre"// Le coffre doit être unique !

object oVault GetObjectByTagsVault );
object oLoot GetFirstItemInInventoryoVault );

while( 
oLoot != OBJECT_INVALID )
{
    
// A toi de voir quel méthode tu veux utiliser pour dire si l'objet est dropé ou non
    
if( d100 95 // Là, c'est juste un exemple
        
CopyItemoLootoDeadTRUE );
        
    
oLoot GetNextItemInInventoryoVault );

On peut même améliorer ça:
Code PHP:

object oDead OBJECT_SELF;

string sVault GetTag(oDead)+"_Vault"// Et hop, un coffre unique par PNJ par exemple
.... 
Dans le cas où tu as des items qui peuvent drop sur des monstres différents il vaut mieux avoir un seul container.

Tu as la base pour la récupération des objets, il ne te reste plus qu'à trouver quand initialiser tes objets. La meilleure solution reste d'éparpiller toute l'initialisation via des DelayCommand à partir du module load. Ça t'évite le pic tout en restant assez rapide.
Oui, il est plus facile de remplir l'inventaire du ou des coffres directement dans le module, en créant les blueprints spéciaux adéquats.
Mais la suggestion de Lv4 reste tout à fait valable, ne serait-ce que pour mettre le ou les dit coffres au chaud dans les limbes, ou encore remplir le ou les coffres en fonction d'une base de données, etc, ça ouvre beaucoup de possibilité ^^
Excusez-moi pour ce retard à répondre, mais entre temps je me suis penché sur la création d'une map-monde pour mon module
Bon au final j'y ai passé la semaine lol mais ça fonctionne c'est l'essentiel ^^

Alors tout d'abord, merci pour vos contributions, je m'y penche en début de semaine, et je reviens vers vous si j'ai un souci
Citation :
Publié par C.DuK
Oui tu as bien compris l'idée, et grosso-modo, voilà ce que ça pourrait donner:
Code PHP:

object oDead OBJECT_SELF;
 
string sVault "tagducoffre"// Le coffre doit être unique !
 
object oVault GetObjectByTagsVault );
object oLoot GetFirstItemInInventoryoVault );
 
while( 
oLoot != OBJECT_INVALID )
{
    
// A toi de voir quel méthode tu veux utiliser pour dire si l'objet est dropé ou non
    
if( d100 95 // Là, c'est juste un exemple
        
CopyItemoLootoDeadTRUE );
 
    
oLoot GetNextItemInInventoryoVault );

On peut même améliorer ça:
Code PHP:

object oDead OBJECT_SELF;
 
string sVault GetTag(oDead)+"_Vault"// Et hop, un coffre unique par PNJ par exemple
.... 
Bon je prends le temps de regarder cette histoire de drop et 1ere question: le script ci-dessus est-il à incorporé dans le "on_death" de la créature dont on veut qu'elle drop les items du coffre?

D'avance merci pour la réponse ^^
Oui, c'est bien ça, c'est pour être incorporé (ou exécuté via) au "on_death" des créatures.
Ça devrait te donner une bonne base pour ton script.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés