La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 12:44:30
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
mork Seigneur Messages: 205 Localisation: A landeda, pres de brest |
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 :
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 . 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 | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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 | |
mork Seigneur Messages: 205 Localisation: A landeda, pres de brest |
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 | |
castorus Acolyte Messages: 23 |
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 :
//:///////////////////////// ///////////////////// //:: Default On Attacked //:: NW_C2_DEFAULT5 //:: Copyright (c) 2001 Bioware Corp. //:///////////////////////// //////////////////// /* If already fighting then ignore, else determine combat round */ //:///////////////////////// //////////////////// //:: Created By: Preston Watamaniuk //:: Created On: Oct 16, 2001 //:///////////////////////// //////////////////// #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)); } } 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 | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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; } } } } |
Revenir en haut | |
mork Seigneur Messages: 205 Localisation: A landeda, pres de brest |
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 | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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 | |
mork Seigneur Messages: 205 Localisation: A landeda, pres de brest |
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 | |
Seth de Sombrelune Seigneur Messages: 156 |
je passe par là et je lance une idée en l'air (on verra bien où elle retombe )
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 ! 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 : 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 | |
mork Seigneur Messages: 205 Localisation: A landeda, pres de brest |
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 :
//:///////////////////////// //////////////////////// //:: NW_C2_DEFAULT6 //:: Default OnDamaged handler /* If already fighting then ignore, else determine combat round */ //:///////////////////////// //////////////////////// //:: Copyright (c) 2002 Floodgate Entertainment //:: Created By: Naomi Novik //:: Created On: 12/22/2002 //:///////////////////////// //////////////////////// #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)); } } 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é ). Voila ! _________________ Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort |
Revenir en haut | |
Seth de Sombrelune Seigneur Messages: 156 |
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 | |
edisnotdead Grand Chevalier Messages: 132 |
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)); } } l arme qu il utilise c est un arc pas des fleche ^^ |
Revenir en haut | |
mork Seigneur Messages: 205 Localisation: A landeda, pres de brest |
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 . Voila, @+ _________________ Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort |
Revenir en haut | |
edisnotdead Grand Chevalier Messages: 132 |
la j avoue je seche je chercherai se soir sinon en effet on ne peut diviser par zero ^^
|
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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 | |
castorus Acolyte Messages: 23 |
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 :
//:///////////////////////// //////////////////////// //:: NW_C2_DEFAULT6 //:: Default OnDamaged handler /* If already fighting then ignore, else determine combat round */ //:///////////////////////// //////////////////////// //:: Copyright (c) 2002 Floodgate Entertainment //:: Created By: Naomi Novik //:: Created On: 12/22/2002 //:///////////////////////// //////////////////////// #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)); } } 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 | |
mork Seigneur Messages: 205 Localisation: A landeda, pres de brest |
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 | |
edisnotdead Grand Chevalier Messages: 132 |
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)); } } |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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); } 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 !) |
Revenir en haut | |
mork Seigneur Messages: 205 Localisation: A landeda, pres de brest |
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 | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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 | |
edisnotdead Grand Chevalier Messages: 132 |
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 | |
edisnotdead Grand Chevalier Messages: 132 |
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()&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); } |
Revenir en haut | |
Sith Vicious Grand Sage du Conseil Messages: 693 |
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 ç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 | |
mork Seigneur Messages: 205 Localisation: A landeda, pres de brest |
Euh... j'y comprends plus grand chose la ... le corps ne disparait même plus quand j'ai tué le pnj
_________________ Aléthéia | Ceux qui cherchent la vie trouveront la mort, ceux qui cherchent la mort trouveront la mort |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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