La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 13/05/2024 21:49:21


  Page 1 sur 2 ¤ Aller à la page 1, 2  Suivante

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 12/03/2006 15:45:34 Sujet du message : Récupérer les flèches ou autres armes a jet

D'abord bonjour a tous et a toutes.

Je voudrais savoir s'il était possible de récupérer les flèches, les haches de jet, les shurikens et autres armes de jet que l'on a tire en touchant un monstre en les récupérant dans l'inventaire de ce monstre.

Je m'explique peut être plus clairement :


    Je suis un Rodeur spécialisé au tir a l'arc

    Je rencontre un monstre, un gobelin par exemple

    Je le tue en lui tirant 3 flèches magiques (1d6 degat de frois) dessus

    Le gobelin laisse un reste, je vais pour les prendre et dans ces restes je trouve mes trois flèches magiques (1d6 degats de froid)


Voila a peu près ce que je souhaite, et que ca marche pour toutes les armes a jet, hache de jet, surikhen etc..

Si quelqu'un a deja vu une chose semblable sur le Vault, ou que c'est impossible a faire, ce serait sympas de me le dire Very Happy . Si c'est pas sur le Vault et que c'est possible, j'aimerai bien savoir avec quelles fonctions, dans quel(s) onglet script du monstre il faut mettre le(s) script(s) etc... je ferais le script par ci et par la, jusqu'a avoir un résultat final que je publierai si ca interrese quelqu'un car je trouve que c'est assez réaliste.

Merci d'avance ! Mork.
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 12/03/2006 16:19:47 Sujet du message :

Comme ça vite fait je te dirais d'essayer de faire un script OnHit sur tes flèches, ça me parait faisable comme ça. Mais ça implique de refaire toutes les flèches et munitions du jeu pour ton module.

Parceque sinon sur les scripts du monstre ça me semble dur, ptet sur le OnDamaged, tu vérifie si le LastDamager a une arme à distance dans la main, et tu copies les munitions qu'il a dans son slot correspondant à l'arme utilisée sur le monstre. Ca peut marcher aussi remarque.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 12/03/2006 16:33:45 Sujet du message :

Tout d'abord merci pour ta réponse.
Ensuite pour le OnHit, je sais comment l'utiliser mais je ne voit pas ce que tu veux dire ni comment faire pour les flèches, car il faudrait que le pj tire sans se rendre compte de rien. Si tu pouvais m'expliquer comment faire, et les fonctions importantes ce serait sympas, merci d'avance.

mork
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
castorus
Acolyte
Inscrit le: 24 Déc 2005
Messages: 23
Répondre en citant
Posté le : 12/03/2006 16:51:04 Sujet du message :

oui il y a moyen ^^
J'explique vite fait :
Des scripts d'origine ont étés inclut dans NWN pour les events des créatures nous allons donc modifier un de ces script d'origine qui est destiné a l'event OnPhysicalAttacked des créatures le nom du script que nous allons modifier est :

nw_c2_default5

cela donne ceci (remplacer directement le script par ceci en faisant un copier coller)

NWScript :

//:Confused///////////////////////// /////////////////////
//:: Default On Attacked
//:: NW_C2_DEFAULT5
//:: Copyright (c) 2001 Bioware Corp.
//:Confused///////////////////////// ////////////////////
/*
    If already fighting then ignore, else determine
    combat round
*/

//:Confused///////////////////////// ////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Oct 16, 2001
//:Confused///////////////////////// ////////////////////

#include "nw_i0_generic"

void main()
{
object oAttacker = GetLastAttacker();
object Arme = GetLastWeaponUsed(oAttacker);
int TypeArme = GetBaseItemType(Arme);
object ObjetCree;

if((TypeArme == BASE_ITEM_HEAVYCROSSBOW)||
  (TypeArme == BASE_ITEM_LIGHTCROSSBOW) ||
  (TypeArme == BASE_ITEM_LONGBOW) ||
  (TypeArme == BASE_ITEM_SHORTBOW))
  {
  ObjetCree=CreateItemOnObject("nw_wamar001",OBJECT_SELF);
  SetDroppableFlag(ObjetCree,TRUE);
  }
    switch(TypeArme)
    {
    case BASE_ITEM_THROWINGAXE:
    ObjetCree=CreateItemOnObject(GetResRef(Arme),OBJECT_SELF);
    SetDroppableFlag(ObjetCree,TRUE);
    break;
    case BASE_ITEM_SHURIKEN:
    ObjetCree=CreateItemOnObject(GetResRef(Arme),OBJECT_SELF);
    SetDroppableFlag(ObjetCree,TRUE);
    break;
    }

    if(GetFleeToExit()) {
        // Run away!
        ActivateFleeToExit();
    } else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) {
        // We give an attacker one warning before we attack
        // This is not fully implemented yet
        SetSpawnInCondition(NW_FLAG_SET_WARNINGS, FALSE);

        //Put a check in to see if this attacker was the last attacker
        //Possibly change the GetNPCWarning function to make the check
    } else {

        if (!GetIsObjectValid(oAttacker)) {
            // Don't do anything, invalid attacker

        } else if (!GetIsFighting(OBJECT_SELF)) {
            // We're not fighting anyone else, so
            // start fighting the attacker
            if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
                SetSummonHelpIfAttacked();
                DetermineSpecialBehavior(oAttacker);
            } else if (GetArea(oAttacker) == GetArea(OBJECT_SELF)) {
                SetSummonHelpIfAttacked();
                DetermineCombatRound(oAttacker);
            }

            //Shout Attack my target, only works with the On Spawn In setup
            SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

            //Shout that I was attacked
            SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
        }
    }


    if(GetSpawnInCondition(NW_FLAG_ATTACK_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_ATTACKED));
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


par contre je n'ai pas trouver comment faire pour créer une fleche du meme type qui a ete tiré. Je vous laisse trouver la solution^^. ++
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 12/03/2006 17:01:17 Sujet du message :

En fait dans le script du OnHit, tu peux récuperer l'objet qui appelle le script, donc si ça touche, tu récupère la resref de l'item appelant le script, et tu le crèes sur la cible.

J'ai essayé vite fait ça marche comme ça (bon ça enlève pas le problème qu'il faut que tu modifies toutes tes munitions et armes de jet, ça c'est le plus relou.

dans x2_s3_onhitcast tu rajoutes :

NWScript :

#include "x2_inc_switches"

void main()
{

  object oItem; // The item casting triggering this spellscript
  object oSpellTarget; // On a weapon: The one being hit. On an armor: The one hitting the armor
  object oSpellOrigin; // On a weapon: The one wielding the weapon. On an armor: The one wearing an armor

  // fill the variables
  oSpellOrigin = OBJECT_SELF;
  oSpellTarget = GetSpellTargetObject();
  oItem = GetSpellCastItem();

  if (GetIsObjectValid(oItem))
  {
    //Partie a rajouter
    int nBaseItem = GetBaseItemType(oItem);
    if (nBaseItem == BASE_ITEM_ARROW | BASE_ITEM_BOLT | BASE_ITEM_BULLET) //rajouter les armes de jet
    {
        //SendMessageToPC(GetFirstPC() ,"onhitcast projo ok");
        string sRef = GetResRef(oItem);
        object oProjo = CreateItemOnObject(sRef,oSpellTarget);
        SetDroppableFlag(oProjo,TRUE);
        return; //sauf si t'as deja des projos a pouvoir unique
    }//Fin du rajout

    // * Generic Item Script Execution Code
    // * If MODULE_SWITCH_EXECUTE_TAGBASED _SCRIPTS is set to TRUE on the module,
    // * it will execute a script that has the same name as the item's tag
    // * inside this script you can manage scripts for all events by checking against
    // * GetUserDefinedItemEventNumber( ). See x2_it_example.nss
    if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE)
    {
        SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ONHITCAST);
        int nRet = ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
        if (nRet == X2_EXECUTE_SCRIPT_END)
        {
          return;
        }
    }
  }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 12/03/2006 17:22:40 Sujet du message :

Merci a tous les deux pour vos réponses.

Pour les fleches, qu'est ce qu'il faut que je leur rajoute ? (c'est ca que j'ai pas bien compris) car la le pnj laisse pas de drops et les flèches n'ont pas de pouvoir unique.
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 12/03/2006 17:32:16 Sujet du message :

Ma solution marchera pour tous les projectiles auxquels tu rajouteras un pouvoir unique OnHit. Mais faut voir si c'est pas plus simple avec une autre solution sur les scripts de monstres, comme celle de castorus.

Par contre je passerais plus par le OnDamaged (sinon tous les projectiles se retrouvent sur la cible, même ceux qui la ratent). Et dans l'état actuel, son script ne prend pas en compte le type de projectile pour les armes à distance. Mais tout ça ça se corrige.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 12/03/2006 17:35:13 Sujet du message :

Pour la solution de Castorus, toutes les flèches qui sont tirées a côté se retrouvent dedans l'inventaire du monstre...
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Seth de Sombrelune
Seigneur
Inscrit le: 10 Jan 2005
Messages: 156
Répondre en citant
Posté le : 12/03/2006 20:23:57 Sujet du message :

je passe par là et je lance une idée en l'air (on verra bien où elle retombe Very Happy)

POur le script proposé par Castorus, n'est il pas possible grace a sons script de recuperer le type d'arme qui attaque la créature (ici une munition via l'arme de jet) on la stoke sur un SetLocalObjet, et on teste avec un Script sur le OnDamaged si l'arme a blesser la créature. Si elle blesse, elle est dans l'inventaire, sinon...

Par contre on pourait alors faire un test basé sur un % de recuperer la munition, par exemple 40% de chance de recupéré la munition.
De même si on a des chance de recuperer les munitions sur les créature tuée, pourquoi ne pas aussi pouvoir recuperer celles qui ont ratée ? (là aussi avec un % !)

Dans ce cas, on reprend le script du Ondamaged et si l'arme n'est pas dans l'inventaire, elle se retrouve a une distance x aléatoire de la créature.

Je vous le dit honnetement, je n'ai pas les compétence pour exploiter cette idée c'est pour cela que je ne donne aucun morceau de script ! Embarassed

Et pour recuperer l'item munition, on peu savoir quel item blesse la créature, soit par le OnPhysicalAttacked

object Arme = GetLastWeaponUsed(oAttacker);
int TypeArme = GetBaseItemType(Arme);

Soit par l'examen du slot munition du pj qui attaque, ensuite pourquoi pas ne pas utiliser un
NWScript :
object CopyItem (
  object oItem,
  [object oTargetInventory = OBJECT_INVALID],
  [int bCopyVars = FALSE]
);
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
Very Happy
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 14/03/2006 17:42:47 Sujet du message :

Salut !

J'ai essayer avec le OnDamge, car sur un autre forum c'est ce qu'on m'a dit de faire.

Voici le script :

NWScript :
//:Confused///////////////////////// ////////////////////////
//:: NW_C2_DEFAULT6
//:: Default OnDamaged handler
/*
    If already fighting then ignore, else determine
    combat round
*/

//:Confused///////////////////////// ////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:Confused///////////////////////// ////////////////////////

#include "nw_i0_generic"

void main()
{
    if(GetFleeToExit()) {
        // We're supposed to run away, do nothing
    } else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) {
        // don't do anything?
    } else {
        object oDamager = GetLastDamager();
        if (!GetIsObjectValid(oDamager)) {
            // don't do anything, we don't have a valid damager
        } else if (!GetIsFighting(OBJECT_SELF)) {
            // If we're not fighting, determine combat round
            if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
                DetermineSpecialBehavior(oDamager);
            } else {
                if(!GetObjectSeen(oDamager)
                  && GetArea(OBJECT_SELF) == GetArea(oDamager)) {
                    // We don't see our attacker, go find them
                    ActionMoveToLocation(GetLocation(oDamager), TRUE);
                    ActionDoCommand(DetermineCombatRound());
                } else {
                    DetermineCombatRound();
                }
            }
        } else {
            // We are fighting already -- consider switching if we've been
            // attacked by a more powerful enemy
            object oTarget = GetAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedSpellTarget();

            // If our target isn't valid
            // or our damager has just dealt us 25% or more
            //    of our hp in damager
            // or our damager is more than 2HD more powerful than our target
            // switch to attack the damager.
            if (!GetIsObjectValid(oTarget)
                || (
                    oTarget != oDamager
                    && (
                        GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4)
                        || (GetHitDice(oDamager) - 2) > GetHitDice(oTarget)
                        )
                    )
                )
            {
                // Switch targets
                DetermineCombatRound(oDamager);
            }
        }
    }

    {
                    object oDamager = GetLastDamager ();
                    object oArme = GetLastWeaponUsed (oDamager);
                    object oMun = GetItemInSlot (BASE_ITEM_ARROW | BASE_ITEM_BOLT | BASE_ITEM_BULLET);
                    string sRes = GetResRef (oMun);
                    int nType = GetBaseItemType (oArme);
                    if (nType == BASE_ITEM_ARROW | BASE_ITEM_BOLT | BASE_ITEM_BULLET )
                    {
                    object oCree = CreateItemOnObject(sRes,OBJECT_SELF);
                    SetDroppableFlag(oCree,TRUE);
                    }

                    }
    // Send the user-defined event signal
    if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DAMAGED));


    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Il ne marche pas, le pnj ne droppe pas les flèches...

-> @ Seth : Pour le CopyItem, je pense qu'il copira toutes les flèches, par exemple le pj tire une fleche qui atteint sa cible, le script copiera les 98 flèches qui lui reste (je pense car je n'ai pas testé Very Happy).

Voila !
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Seth de Sombrelune
Seigneur
Inscrit le: 10 Jan 2005
Messages: 156
Répondre en citant
Posté le : 14/03/2006 18:16:35 Sujet du message :

hum, si le script copie l'item munition avec sont nombre d'empilement, il ne tient qu'a nous de reduire ce nombre a 1.
Lorsque tu copie l'item, tu regarde la valeur du stak et tu la reduit a 1. A la limite, tu peux même en faire une petite fonction.

Faudrais que je me penche plus sérieusement sur ton problème, je pense avoir une bonne piste, mais il me manque encore beaucoup de conaissance. je doit avant tout eplucher les scripts proposer pour te faire ma proposition. Par contre là j'ai 2 script à faire, je les termine et je vois ce que je peux faire pour toi.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
edisnotdead
Grand Chevalier
Inscrit le: 19 Fév 2005
Messages: 132
Répondre en citant
Posté le : 14/03/2006 18:57:44 Sujet du message :

je suis pas trop sur entre les bullet et tous sa mais a mon avis ca devrai ressembler plus a ca

NWScript :
//:Confused/////////////////// ////// ////////////////////////
//:: NW_C2_DEFAULT6
//:: Default OnDamaged handler
/*
    If already fighting then ignore, else determine
    combat round
*/

//:Confused/////////////////// ////// ////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:Confused/////////////////// ////// ////////////////////////

#include "nw_i0_generic"

void main()
{
    if(GetFleeToExit()) {
        // We're supposed to run away, do nothing
    } else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) {
        // don't do anything?
    } else {
        object oDamager = GetLastDamager();
        if (!GetIsObjectValid(oDamager)) {
            // don't do anything, we don't have a valid damager
        } else if (!GetIsFighting(OBJECT_SELF)) {
            // If we're not fighting, determine combat round
            if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
                DetermineSpecialBehavior(oDamager);
            } else {
                if(!GetObjectSeen(oDamager)
                  && GetArea(OBJECT_SELF) == GetArea(oDamager)) {
                    // We don't see our attacker, go find them
                    ActionMoveToLocation(GetLocation(oDamager), TRUE);
                    ActionDoCommand(DetermineCombatRound());
                } else {
                    DetermineCombatRound();
                }
            }
        } else {
            // We are fighting already -- consider switching if we've been
            // attacked by a more powerful enemy
            object oTarget = GetAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedSpellTarget();

            // If our target isn't valid
            // or our damager has just dealt us 25% or more
            //    of our hp in damager
            // or our damager is more than 2HD more powerful than our target
            // switch to attack the damager.
            if (!GetIsObjectValid(oTarget)
                || (
                    oTarget != oDamager
                    && (
                        GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4)
                        || (GetHitDice(oDamager) - 2) > GetHitDice(oTarget)
                        )
                    )
                )
            {
                // Switch targets
                DetermineCombatRound(oDamager);
            }
        }
    }

    {
                    object oDamager = GetLastDamager ();
                    object oArme = GetLastWeaponUsed (oDamager);
                    //object oMun = GetItemInSlot (BASE_ITEM_ARROW | BASE_ITEM_BOLT | BASE_ITEM_BULLET);
                  //string sRes = GetResRef (oMun);
                    //int nType = GetBaseItemType (oArme);
                    object oWp = GetItemInSlot (INVENTORY_SLOT_RIGHTHAND, oDamager);
                    string sres = GetResRef(oWp);
                    object oWp2 = GetItemInSlot (INVENTORY_SLOT_ARROWS, oDamager);
                    string sres2 = GetResRef(oWp2);
                    object oWp3 = GetItemInSlot (INVENTORY_SLOT_BULLETS, oDamager);
                  string sres3 = GetResRef( oWp3);
                    object oWp4 = GetItemInSlot (INVENTORY_SLOT_BOLTS, oDamager);
                  string sres4 = GetResRef( oWp4);

        if (GetBaseItemType(oWp) == BASE_ITEM_LONGBOW || BASE_ITEM_SHORTBOW || BASE_ITEM_HEAVYCROSSBOW )

        {object oCree = CreateItemOnObject(sres2,OBJECT_SELF);
                    SetDroppableFlag(oCree,TRUE);}
                  else if (GetBaseItemType(oWp) == BASE_ITEM_DART || BASE_ITEM_SHURIKEN)
        {object oCree = CreateItemOnObject(sres,OBJECT_SELF);
                    SetDroppableFlag(oCree,TRUE);}
                    else if (GetBaseItemType(oWp) == BASE_ITEM_SLING )
        {object oCree = CreateItemOnObject(sres4,OBJECT_SELF);
                    SetDroppableFlag(oCree,TRUE);}
                  else if (GetBaseItemType(oWp) == BASE_ITEM_HEAVYCROSSBOW )
                  { object oCree = CreateItemOnObject(sres3,OBJECT_SELF);
                    SetDroppableFlag(oCree,TRUE);}
                    }




    // Send the user-defined event signal
    if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DAMAGED));


    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


l arme qu il utilise c est un arc pas des fleche ^^
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 14/03/2006 20:49:02 Sujet du message :

Humm ...

Je viens de tester le script, je mets un pnj, je mets aussi un placeable utilisable avec inventaire. Je tire sur le placeable, je regarde l'inventaire, les flèches y sont, donc ca les créer. Ensuite je tire sur le pnj, il meurt, mais les flèches ne sont pas dans ses drops... je trouve ca bizard.

Ensuite quand je tirai sur le placeable, un message m'est apparu, le voici :

"Script nw_c2_deafault6, DID: 80000006; tag : Keg, ERREUR : DIVIDE BY ZERO"

Je me semande bien ce que ca peut être Confused.

Voila, @+
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
edisnotdead
Grand Chevalier
Inscrit le: 19 Fév 2005
Messages: 132
Répondre en citant
Posté le : 15/03/2006 06:37:34 Sujet du message :

la j avoue je seche je chercherai se soir sinon en effet on ne peut diviser par zero ^^
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 15/03/2006 15:05:28 Sujet du message :

Je pense que la division par 0 ça doit être dans les parties de script gérant l'AI, pour un plaçable faudrait les virer.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
castorus
Acolyte
Inscrit le: 24 Déc 2005
Messages: 23
Répondre en citant
Posté le : 15/03/2006 15:36:17 Sujet du message :

Arf me voici de retour , pour vous jouer un mauvais tour AHAH.... bon d'accord c'était nul...

En fait j'ai trouvé une solution de substitution grâce a vos réponse voila ce que je propose :

1-Exploitation de l'event des creatures OnDamaged.
2-Exploitation des slots pour obtenir le resref d'un objet.


voici une petite solution qui fera donc l'affaire pour toutes flêches décochées tout shuriken lancé toute hache de jet. Le projectile lancé touchant sa cible sera copier dans l'inventaire de la victime.
En revanche je n'ai pas fait la gestion des frondes ni des arbalètes a vous de le faire chers amis scripteurs ^^.

Voici le code qui devra etre substitué au code source originel nommé nw_c2_default6 :
(Vous devrez donc remplacer le code originel de nw_c2_default6 par le code qui va suivre .)


NWScript :

//:Confused///////////////////////// ////////////////////////
//:: NW_C2_DEFAULT6
//:: Default OnDamaged handler
/*
    If already fighting then ignore, else determine
    combat round
*/

//:Confused///////////////////////// ////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:Confused///////////////////////// ////////////////////////

#include "nw_i0_generic"

void main()
{
object oDamager = GetLastDamager();/*On enregistre le dernier agresseur ayant toucher OBJECT_SELF)*/
object Arme = GetLastWeaponUsed(oDamager);
int TypeArme = GetBaseItemType(Arme);/*On regarde quel est le type d'item que le dernier agresseur a employer.*/
object ObjetCree;
object Fleche;

if((TypeArme == BASE_ITEM_HEAVYCROSSBOW)||
  (TypeArme == BASE_ITEM_LIGHTCROSSBOW) ||
  (TypeArme == BASE_ITEM_LONGBOW) ||
  (TypeArme == BASE_ITEM_SHORTBOW))
  {
    if((Fleche = GetItemInSlot(INVENTORY_SLOT_ARROWS,oDamager))!=OBJECT_INVALID)
    {
    ObjetCree=CreateItemOnObject(GetResRef(Fleche),OBJECT_SELF);
    SetDroppableFlag(ObjetCree,TRUE);
    }
  }
    switch(TypeArme)
    {
    case BASE_ITEM_THROWINGAXE:
    ObjetCree=CreateItemOnObject(GetResRef(Arme),OBJECT_SELF);
    SetDroppableFlag(ObjetCree,TRUE);
    break;
    case BASE_ITEM_SHURIKEN:
    ObjetCree=CreateItemOnObject(GetResRef(Arme),OBJECT_SELF);
    SetDroppableFlag(ObjetCree,TRUE);
    break;
    }

    if(GetFleeToExit()) {
        // We're supposed to run away, do nothing
    } else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) {
        // don't do anything?
    } else {

        if (!GetIsObjectValid(oDamager)) {
            // don't do anything, we don't have a valid damager
        } else if (!GetIsFighting(OBJECT_SELF)) {
            // If we're not fighting, determine combat round
            if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
                DetermineSpecialBehavior(oDamager);
            } else {
                if(!GetObjectSeen(oDamager)
                  && GetArea(OBJECT_SELF) == GetArea(oDamager)) {
                    // We don't see our attacker, go find them
                    ActionMoveToLocation(GetLocation(oDamager), TRUE);
                    ActionDoCommand(DetermineCombatRound());
                } else {
                    DetermineCombatRound();
                }
            }
        } else {
            // We are fighting already -- consider switching if we've been
            // attacked by a more powerful enemy
            object oTarget = GetAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedSpellTarget();

            // If our target isn't valid
            // or our damager has just dealt us 25% or more
            //    of our hp in damager
            // or our damager is more than 2HD more powerful than our target
            // switch to attack the damager.
            if (!GetIsObjectValid(oTarget)
                || (
                    oTarget != oDamager
                    && (
                        GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4)
                        || (GetHitDice(oDamager) - 2) > GetHitDice(oTarget)
                        )
                    )
                )
            {
                // Switch targets
                DetermineCombatRound(oDamager);
            }
        }
    }

    // Send the user-defined event signal
    if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DAMAGED));
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Voila , j'espère que vous comprendrez.
J'espère avoir contribué à résoudre ce problème efficacement ^^.
++.



(P.S : Serait-il possible que l'on modifie mon statut sur le forum? Parce que je me fait a chaque fois tailler par mes compagnons de projets de nwn et de prog C++ , le statut novice il fait peine sur moi... y'orais pas moyen que vous me mettiez au moins en initié svp?)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 15/03/2006 18:14:33 Sujet du message :

Euh ... ben je sais pas si c'est moi ou pas mais les flèches ne sont toujours pas dropée :s.
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
edisnotdead
Grand Chevalier
Inscrit le: 19 Fév 2005
Messages: 132
Répondre en citant
Posté le : 15/03/2006 20:32:49 Sujet du message :

essaye ca pour voir a mon avis c est une mauvaise utilisation de setdropable qu on fesai

NWScript :
//:Confused/////////////////// ////// ////////////////////////
//:: NW_C2_DEFAULT6
//:: Default OnDamaged handler
/*
    If already fighting then ignore, else determine
    combat round
*/

//:Confused/////////////////// ////// ////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 12/22/2002
//:Confused/////////////////// ////// ////////////////////////

#include "nw_i0_generic"

void main()
{
    if(GetFleeToExit()) {
        // We're supposed to run away, do nothing
    } else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) {
        // don't do anything?
    } else {
        object oDamager = GetLastDamager();
        if (!GetIsObjectValid(oDamager)) {
            // don't do anything, we don't have a valid damager
        } else if (!GetIsFighting(OBJECT_SELF)) {
            // If we're not fighting, determine combat round
            if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
                DetermineSpecialBehavior(oDamager);
            } else {
                if(!GetObjectSeen(oDamager)
                  && GetArea(OBJECT_SELF) == GetArea(oDamager)) {
                    // We don't see our attacker, go find them
                    ActionMoveToLocation(GetLocation(oDamager), TRUE);
                    ActionDoCommand(DetermineCombatRound());
                } else {
                    DetermineCombatRound();
                }
            }
        } else {
            // We are fighting already -- consider switching if we've been
            // attacked by a more powerful enemy
            object oTarget = GetAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedAttackTarget();
            if (!GetIsObjectValid(oTarget))
                oTarget = GetAttemptedSpellTarget();

            // If our target isn't valid
            // or our damager has just dealt us 25% or more
            //    of our hp in damager
            // or our damager is more than 2HD more powerful than our target
            // switch to attack the damager.
            if (!GetIsObjectValid(oTarget)
                || (
                    oTarget != oDamager
                    && (
                        GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4)
                        || (GetHitDice(oDamager) - 2) > GetHitDice(oTarget)
                        )
                    )
                )
            {
                // Switch targets
                DetermineCombatRound(oDamager);
            }
        }
    }

    {
                    object oDamager = GetLastDamager ();
                    object oArme = GetLastWeaponUsed (oDamager);
                    //object oMun = GetItemInSlot (BASE_ITEM_ARROW | BASE_ITEM_BOLT | BASE_ITEM_BULLET);
                  //string sRes = GetResRef (oMun);
                    //int nType = GetBaseItemType (oArme);
                    object oWp = GetItemInSlot (INVENTORY_SLOT_RIGHTHAND, oDamager);
                    string sres = GetResRef(oWp);
                    object oWp2 = GetItemInSlot (INVENTORY_SLOT_ARROWS, oDamager);
                    string sres2 = GetResRef(oWp2);
                    object oWp3 = GetItemInSlot (INVENTORY_SLOT_BULLETS, oDamager);
                  string sres3 = GetResRef( oWp3);
                    object oWp4 = GetItemInSlot (INVENTORY_SLOT_BOLTS, oDamager);
                  string sres4 = GetResRef( oWp4);
                    int bDroppable=d100()>25;
        if (GetBaseItemType(oWp) == BASE_ITEM_LONGBOW || BASE_ITEM_SHORTBOW || BASE_ITEM_HEAVYCROSSBOW )

                      //75 pourcent de chance  de recup
        {object oCree = CreateItemOnObject(sres2,OBJECT_SELF);
                    SetDroppableFlag(oCree,bDroppable);}
                  else if (GetBaseItemType(oWp) == BASE_ITEM_DART || BASE_ITEM_SHURIKEN)
        {object oCree = CreateItemOnObject(sres,OBJECT_SELF);
                    SetDroppableFlag(oCree,bDroppable);}
                    else if (GetBaseItemType(oWp) == BASE_ITEM_SLING )
        {object oCree = CreateItemOnObject(sres4,OBJECT_SELF);
                    SetDroppableFlag(oCree,bDroppable);}
                  else if (GetBaseItemType(oWp) == BASE_ITEM_HEAVYCROSSBOW )
                  { object oCree = CreateItemOnObject(sres3,OBJECT_SELF);
                    SetDroppableFlag(oCree,bDroppable);}
                    }
                    SetLootable(OBJECT_SELF, TRUE);



    // Send the user-defined event signal
    if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DAMAGED));


    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 16/03/2006 02:54:32 Sujet du message :

NWScript :

void RecupMunitions(object oDamager, object oCible = OBJECT_SELF,int nProbaRecup = 25)
{
    object oArme = GetLastWeaponUsed(oDamager);
    if (! GetWeaponRanged(oArme) || d100()>nProbaRecup || oArme == OBJECT_INVALID) return;

    //int nProbaRecup = 25; //pourcentage de chance de recuperer les munitions
    //if (d100()>nProbaRecup) return;

    int nSlot = INVENTORY_SLOT_RIGHTHAND;
    int nBaseItemType = GetBaseItemType(oArme);
    switch (nBaseItemType)
    {
        case BASE_ITEM_LONGBOW :
        case BASE_ITEM_SHORTBOW : nSlot = INVENTORY_SLOT_ARROWS; break;
        case BASE_ITEM_HEAVYCROSSBOW :
        case BASE_ITEM_LIGHTCROSSBOW : nSlot = INVENTORY_SLOT_BOLTS; break;
        case BASE_ITEM_SLING : nSlot = INVENTORY_SLOT_BULLETS; break;
    }
    string sResRef = GetResRef(GetItemInSlot(nSlot,oDamager));

    //Bon la je suis pas sur de moi du tout pour ce if, c'est vraiment pour faire genre
    //C'est au cas ou le type a lance sa derniere hache ou tire son dernier carreau
    //mais je garantis rien !!!
    if (sResRef == "" )
    {
      if (nSlot ==INVENTORY_SLOT_RIGHTHAND) sResRef = GetResRef(oArme); //ca ca va
      else {
                if (GetModuleItemLostBy() == oDamager) sResRef = GetResRef(GetModuleItemLost()); //la par contre c'est tendu
          }

    }//fin du truc a la con

    object oCopy = CreateItemOnObject(sResRef,oCible);
    SetIdentified(oCopy,TRUE);
    SetDroppableFlag(oCopy,TRUE);
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Je ferai ça comme ça. J'ai pas testé. J'en fais une fonction pour qu'on puisse le mettre sur un plaçable aussi (comme une cible d'entrainement). Disez moi si ça marche (si ça marche pas je veux pas le savoir !Laughing)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 16/03/2006 19:24:38 Sujet du message :

Ok, merci a tous, j'ai pas encore tester car je n'ai pas l'AURORA sous la main, je vous dirai si ca marche demain.
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 17/03/2006 00:53:55 Sujet du message :

Bon j'ai testé ma fonction.
Ca marche sauf le "truc à la con", donc le virer (oArme est invalide si c'est une arme de lancer, et pour les munitions ça retrouve pas les objets perdus). Donc voilà, c'est mieux que rien déjà. Et ça marche pas non plus avec le coup de grace, l'objet est pas créé si la cible est mourue, d'après ce que j'ai pu voir.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
edisnotdead
Grand Chevalier
Inscrit le: 19 Fév 2005
Messages: 132
Répondre en citant
Posté le : 17/03/2006 06:29:11 Sujet du message :

pour la derniere munition je me demande si on peut pas stoker un string si c est le cas on stokr le dernier resref sur la creature et on le recupere dans le else ^^

pour l obeject self dans les parametre de ta fonction je voi pas trop l interet autant le mettre direct dans la fonction

ensuite quand tu met 25 c est 75 pourcent de chance avec ta facon
Dernière édition par edisnotdead le 17/03/2006 06:57:58; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
edisnotdead
Grand Chevalier
Inscrit le: 19 Fév 2005
Messages: 132
Répondre en citant
Posté le : 17/03/2006 06:44:28 Sujet du message :

NWScript :
void RecupMunitions(object oDamager, object oCible = OBJECT_SELF,int nProbaRecup = 25)//25 pourcent
{
    object oArme = GetLastWeaponUsed(oDamager);
    if (! GetWeaponRanged(oArme) || d100()<=nProbaRecup || oArme == OBJECT_INVALID) return;

    //int nProbaRecup = 25; //pourcentage de chance de recuperer les munitions
    //if (d100()&amp;gt;nProbaRecup ) return;

    int nSlot = INVENTORY_SLOT_RIGHTHAND;
    int nBaseItemType = GetBaseItemType(oArme);
    switch (nBaseItemType)
    {
        case BASE_ITEM_LONGBOW :
        case BASE_ITEM_SHORTBOW : nSlot = INVENTORY_SLOT_ARROWS; break;
        case BASE_ITEM_HEAVYCROSSBOW :
        case BASE_ITEM_LIGHTCROSSBOW : nSlot = INVENTORY_SLOT_BOLTS; break;
        case BASE_ITEM_SLING : nSlot = INVENTORY_SLOT_BULLETS; break;
    }
    string sResRef = GetResRef(GetItemInSlot(nSlot,oDamager));

    //Bon la je suis pas sur de moi du tout pour ce if, c'est vraiment pour faire genre
    //C'est au cas ou le type a lance sa derniere hache ou tire son dernier carreau
    //mais je garantis rien !!!
  if (sResRef == "" )
    {
      sResRef = GetLocalString(oCible,"muni"); //la par contre c'est retendu ^^
          }

  //fin du truc a la con

    object oCopy = CreateItemOnObject(sResRef,oCible);
    SetIdentified(oCopy,TRUE);
    SetDroppableFlag(oCopy,TRUE);
    SetLocalString(oCible,"muni",sResRef);
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 17/03/2006 11:37:56 Sujet du message :

Yup je pense que ta solution marche pour les munitions. Sauf que la variable je la placerai sur le tireur, sinon si y a plusieurs tireurs ça peut planter.
25% c'était voulu, c'est pas des flèches en Kevlar-titane-uranium apauvri non plus Very Happy ça casse vite ces choses là.
L'OBJECT_SELF c'est vrai, je me suis tenté avant de le laisser en paramètre, mais bon, pourquoi pas, exemple : tu tire sur des cibles d'entrainement tu recupère tes flèches dans un coffre. Ou tu peux les recréer direct sur le tireur (l'origine est là, pour tester c'était plus simple). Enfin bon. Soit on peut le virer, mais un truc que je ferais c'est de le passer en dernière position, comme dans 98% des cas ça sera OBJECT_SELF, vaut mieux passer le % de recup avant, il a plus de chances d'être modifié.

Un dernier truc le test oArme == OBJECT_INVALID plus j'y pense plus je me dis qu'il sert à rien, il est redondant avec ! GetWeaponRanged(oArme) je pense. A virer aussi.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
mork
Seigneur
Inscrit le: 12 Aoû 2005
Messages: 205
Localisation: A landeda, pres de brest
Répondre en citant
Posté le : 17/03/2006 21:08:44 Sujet du message :

Euh... j'y comprends plus grand chose la ... le corps ne disparait même plus quand j'ai tué le pnj Surprised
_________________
Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 2 ¤ Aller à la page 1, 2  Suivante


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 109.974ms