NWN2 - La Tour des Arcanes

Changer dynamiquement un objet d'environnement en placeable bloquant

Répondre
Partager Rechercher
Une grande question que je me pose ^^

j'ai un placeable positionné au sol sur une map IG, il est en élément d'environnemment (ou en placeable utilisable ça revient au même) et est donc traversable.
Avec un script je pense pouvoir le rendre "static" mais comment faire pour le recalcul de walkmesh ? Car sous l'editeur quand je rends l'objet "static" (ou convertir en placeable ça revient au même) je dois faire un recalcul de la map après .. mais dynamiquement IG, existe-t-il une solution ?
Je ne crois pas qu'il existe de solution, ni pour le passage en statique ni pour le changement du mesh.

Il me semble que le walkmesh est permanent une fois créé, on ne peut pas le changer dynamiquement.
Quand à passer un placeable en statique, si ce plc a été créé en jeu (par script), alors ça ne te sert à rien et en plus et je ne crois pas que ce soit possible.

Une idée peut-être est de faire l'obstruction par script... bon courage. :)

Edit: c'est même écrit dans une [faq] hu hu
Vi la faq explique exactement ce que je fais avec mes objets statics et dynamiques .. dommage que le "But..." n'apporte pas une solution à "le walkmesh n'est jamais modificable IG" mais juste une explication ... fausse joie ^^

dommage (mais j'm'en doutais un peu ^^)
Une solution consisterait à créer un plaçable identique, et modifier ses paramètres de "Comportement". Soit le paramètre "Statique" de l'objet à "FALSE" (décoché) ainsi que le paramètre "Collision dynamique" à "TRUE" (coché).

Via un script, il est possible de le modifier le paramètre "Collision dynamique" en utilisant la fonction "SetCollision(...)".
Il ne faut pas placer le plaçable sur le carte, mais le "spawner" par CreateObject la première fois que le joueur entre sur sur la carte ou au bon moment.

Dans le blueprint du plaçable (ça ne peut pas être un élément d'environnement), cocher la propriété collisions dynamiques.

Une fois "spawné" sur la carte, il bloque alors le passage. Faire un DestroyObject au moment voulu pour libérer le passage.

Le plaçable peut être a priori n'importe quel plaçable, par exemple un groupe de rochers.
De rien .

Précision : on peut même placer le fameux plaçable sur la carte du moment que collisions dynamiques est cochée. Je viens de vérifier. J'ai en effet utilisé les collisions dynamiques à plusieurs endroits et sur le premier cas vérifié je "spawne", pour d'autres je place.

Dans les 2 cas on peut détruire et "respawner". Par exemple pour ne voir une porte secrète cachée par une bibliothèque (à collisions dynamiques) que si l'on s'équipe d'un objet particulier ..
Tests effectués dès ce matin aux aurores ^^

en effet un placeable bloquant popé dynamiquement IG (collision dynamique de coché) peut passer IG, via script, de bloquant à non bloquant puis de non bloquant à bloquant ... et cela autant de fois que je veux.

par contre, si je pop l'objet dynamiquement IG et qu'à la base il est non bloquant (collision dynamique de pas coché), pas moyen de le rendre bloquant
(et bien sur c'est cet ordre de manip qui m'intéresse )
Tu peux toujours le faire apparaître en mode bloquant, puis le rendre non-bloquant par le biais d'un script ou d'une baguette magique. J'avais l'habitude de mettre une variable locale à 1 dans les propriétés de l'objet, accompagnée d'un script dans l'événement "OnHeartBeat", vu que l'événement "OnSpawn" n'existe pas sur les plaçables.
Code PHP:

void main()
{
    
object oSelf OBJECT_SELF;
    if(
GetLocalInt(oSelf,"MA_VARIABLE"))
    {
        
// Si la variable n'est pas correctement supprimée,
        // comme c'était le cas dans NWN 1er du nom,
        // Il vaut mieux utiliser la fonction SetLocalInt(...)
        // SetLocalInt(oSelf,"MA_VARIABLE",0);
        
DeleteLocalInt(oSelf,"MA_VARIABLE");
        
SetCollision(oSelf,FALSE);

        
// Je ne sais pas si ça marche, mais si c'est le cas,
        // on peut peut-être retirer le script de la liste pour
        // soulager le module d'un script récurent :
        
SetEventHandler(oSelf,SCRIPT_PLACEABLE_ON_HEARTBEAT,"");
    }

Il me semblait bien que ce problème avait été évoqué je ne sais plus trop où, mais j'avais un peu oublié.
ça veut pas de chez ça veut pas ^^
J'ai mis le placeable avec collision dynamique de coché

dans le mod_activate qui, à l'activation d'un objet UTI, fait apparaitre le placeable, en plus du createobject j'ai ajouté setcollision (oO, 0) (et j'ai testé avec 0 ou FALSE) => placeable infranchissable

dans le ohb du placeable j'ai mis setcollision(oO, 0) (sans test de variable comme toi Deyonara) => placeable infranchissable

*dépoussière son post*

Je me suis aperçue d'un soucis en voulant rendre un placeable bloquant et un autre à côté en voulant le laisser bloquant. J'appliquais pas le SetCollision au placeable mais au PJ. (pourtant ça changeait bien l'état des placeables ... mais sur toute la map ! )

Quand je m'assure d'avoir bien appliqué le SetCollision sur le bon tag du bon placeable .. il ne se passe rien (si je fais un GetCollision il me retourne bien 0 ou 1 mais pour le même résultat : toujours bloquant)

Quelqu'un avait réussi à bien faire varier l'état du SetCollision d'un placeable indépendemment des autres placeables ?

Merci d'avance
Arf .. bon ça a au moins le mérite d'être clair (même si je m'ne doutais j'avais un petit tout petit espoir ^^)
Merci

*part pleurer dans son coin avec son système de placeables dynamiques*
Si tu veux utiliser des placeables dynamiques, tu peux aussi spawner une "Collision Box" qui va gérer la collision pour toi, normalement.

C'est un peu galère à gérer, surtout si tes placeables sont rotationnables et redimensionnables, mais bon.
Justement nos placeables sont bougeables (rotation, position, altitude)

Nous avons fini par avoir un truc qui fonctionne mais pfff quelle galère pour contourner un bug où une simple fonction aurait fait merveille (et quand je dis "Nous" c'est qu'on s'est mis à 3 pour sortir toutes les idées possibles pour y arriver ^^)
(Nous avons dupliqués nos placeables, un avec la case de collision de cochée, un autre sans la cas de cochée, et à chaque changement d'état souhaité par le joueur -placeable traversant ou bloquant- nous intervertissons les placeables )
Certes on aurait bien aimé. Mais je présume que ça posait des problèmes soit dans le code soit dans la rétrocompatibilité avec les campagnes.

Bref, comme on dit : ce qui est difficile prend une journée, ce qui est impossible prend trois jours. Une journée de 3 personnes et vous avez résolu votre pb
Répondre

Connectés sur ce fil

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