Page 1 sur 1

[SCRIPT] Comment poser un objet au sol et le récupérer par un PNJ ?

Posté : jeu. 19 nov. 2015, 20:13
par Cocrane
Je vais proposer un duel où le gain est l'arme du combattant. Un membre du groupe pourra donc combattre le duelliste.

Dans le cas où le duelliste perd, je sais quel est le nom de l'arme et je peux donc la donner.
Mais dans le cas où c'est le membre du groupe qui perd, j'ignore quelle est le nom de l'arme est utilisé. (je ne vois pas de mot clé utilisable).

Je peux faire poser l'arme perdue au sol et la faire ramasser par le duelliste mais je retrouve le même problème.

Comment ramasser un objet dont on ne connait pas le nom? ^^

* perte de l'objet en main
"effect: drop weapons in panic (264)"

* récupération de l'objet si on a le nom
"257 PickUpItem(S:ResRef*)
This action instructs the active creature remove the item from the area and put it in their inventory (assuming the inventory has enough room and the item exists)."

Posté : jeu. 19 nov. 2015, 21:47
par Kev
J'allais écrire que je ne comprenais pas ton souci, jusqu'a ce que je réalise que si c'est un membre du groupe qui se bat, tu ne peux pas prévoir quelle arme le joueur aura choisi de lui donner...

Est ce qu' une action comme PickUpItem ne peut pas fonctionné avec PickUpItem(NearestOf(myself)) ?
Je dis ça à l'aveugle, sans avoir essayé.

Posté : jeu. 19 nov. 2015, 23:39
par Freddy_Gwendo
J'ai comme l'impression qu'on a déjà eu cette discussion quelque part, mais je ne me souviens plus où. A moins que ce ne soit ailleurs, ou avec quelqu'un d'autre...

Peu importe. ;)

Je crains que le moteur ne permette pas de faire ce que tu veux. Cependant, j'y ai réfléchi depuis et je te propose une piste de travail que je n'ai pas testée. Si elle fonctionne, elle permettrait de contourner les limites de l'IE. ^^

Code : Tout sélectionner

[color="#FFFF00"]264 CopyGroundPilesTo(S:ResRef*,P:Location*)[/color]

This action copies all items lying around on the ground in the current area to the specified point in the target area.
Si l'arme est à terre, elle sera automatiquement "transportée" à l'endroit indiqué. L'inconvénient, c'est que tous les objets qui trainent le seront aussi. Mais je pense que tu peux assumer cet inconvénient pour réussir ton coup. :whistle3:

Quant à

Code : Tout sélectionner

[color="#FFFF00"]257 PickUpItem(S:ResRef*)[/color]

This action instructs the active creature remove the item from the area and put it in their inventory (assuming the inventory has enough room and the item exists).
Comme sa définition l'indique, elle ne permet pas de récupérer un objet dont on ne connait pas le code.

Voilà, voilou l'état de mes réflexions. A toi de les tester. ;)

Bon, je retourne dans mes codes en attendant la prochaine version de WeiDU qui devrait me permettre d'arrêter de me prendre la tête à créer des fonctions pour court-circuiter celles de WeiDU qui ne fonctionnent pas dans des cas particuliers. Et comme par hasard, la loi de Murphy est passée par là et ça concerne mes tp2. :gign:

Posté : ven. 20 nov. 2015, 19:50
par Kev
CopyGroundPilesTo(S:ResRef*,P:Location*)
Si je comprend bien, cette action pourrait copié l'arme au sol dans l'inventaire du duelliste? Donc en utilisant l'action MoveToPoint([P])) aprés la fin du duel, ça pourrait marcher.

Posté : ven. 20 nov. 2015, 23:06
par Isaya
Comme indiqué, l'action CopyGroundPilesTo(S:ResRef*,P:Location*) sert à transférer des piles d'objets au sol d'une zone vers une autre. Elle est utilisée à plusieurs reprises dans le jeu :
  • passage de la zone de départ de ToB vers le plan astral après le combat contre Illasera
  • passage du temple d'ombre au temple en ruines après la mort du seigneur d'ombre
  • passage du bateau de Saemon à la cité Sahuagin
  • passage du combat contre Irenicus aux enfers
  • passage de l'illusion de Kalah au cirque
Bref, il sert partout où le jeu prévoit de récupérer les effets d'éventuels morts au combat à l'occasion d'un changement de zone forcé. Elle va ratisser un peu large si le personnage meurt dans la bataille.

L'alternative est que tu te fasses une liste d'objets que le duelliste est susceptible de réclamer, qu'elle soit ou non portée par le participant du moment que le groupe la possède. Ainsi tu peux tester des noms d'objets bien précis en pariant sur le fait que le groupe sera forcément équipée d'au moins un d'entre ceux que tu prévois. Il y a quand même des incontournables que pratiquement aucun groupe ne peut ignorer.

Posté : sam. 21 nov. 2015, 00:01
par Cocrane
Merci pour vos retours.

Freddy> oui on avait parlé de poser un objet au sol dans le cadre dune prise d'otages où l'on demande au groupe de poser ses armes.

Kev> je testerai mais j'ai des doutes. ^^

Isaya> l'option de la liste est à retenir si je ne parviens à coder ce besoin. Surtout que le Charname peut s'arranger pour avoir une arme de "merde" pour éviter de perdre un belle arme.

Posté : mer. 02 déc. 2015, 23:25
par Cocrane
CopyGroundPilesTo(S:ResRef*,P:Location*) copie les objets au sol dans une zone à un emplacement précis.

En y réflechissant, ca ne va coller à mon besoin: le Player perd son objet.

En le déposant au sol, il perd son objet mais on le voit au sol. Si j'utilise CopyGroundPilesTo, j'en ai une copie ailleurs, ca ne résout donc pas mon problème.

J'ai pensé à la solution suivante:
GiveItemCreate("arme1",PROTAGONIST,1,0,0)
wait(1)
ActionOverride(PROTAGONIST,FillSlot(SLOT_WEAPON))
wait(1)
ActionOverride(PROTAGONIST,DESTROYITEM("arme1"))

Sachant que :
FillSlot(I:Slot*SLOTS)
This action will attempt to fill a slot in the active creature's inventory with the appropriate item type. Using FillSlot(SLOT_WEAPON) will look for any weapon in the inventory, and move the first such item into the weapon slot. Any item already in the slot is destroyed.