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 11/11/2024 17:14:06
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 |
Yan the salor Seigneur Messages: 151 |
Voici mon "onplayerdying". Je souhaiterai rajouter une pénalité immédiate d'xp avant le respawn éventuel du joueur, pour le cas où il est rappelé à la vie, que la pénalité soit déjà effectuée.
De plus je voudrais que l'un des objets porté sur le joueur soit détruit au hasard. Merci beaucoup de votre temps. NWScript :
#include "NW_I0_GENERIC" void bleed(int iBleedAmt) { object oDying = GetLocalObject(OBJECT_SELF, "PCName"); int iDCC = GetLocalInt(oDying, "iPCDCC"); iDCC = iDCC + 1; int iDC; int iDCBase = 10; //Jet de stabilisation iDC = iDCBase; if(iDCC > iDCBase){ iDC = iDCC; } effect eBleedEff; if (GetCurrentHitPoints() <= 0){ if (iBleedAmt > 0){ eBleedEff = EffectDamage(iBleedAmt); }else{ eBleedEff = EffectHeal(-iBleedAmt); } ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, oDying); if (GetCurrentHitPoints() <= -10){ //Mort PlayVoiceChat(VOICE_CHAT_DEATH); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), OBJECT_SELF); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oDying); return; } if (iBleedAmt > 0){ int iConBonus = GetAbilityModifier(ABILITY_CONSTITUTION, oDying); int iStableRoll = d20() + iConBonus; SendMessageToPC(oDying, "Jet de stabilisation : "+IntToString(iStableRoll-iConBonus)+"+"+IntToString(iConBonus)+"="+IntToString(iStableRoll)); SendMessageToPC(oDying, "Jet de reussite : "+IntToString(iDC)); if(iStableRoll >= iDC){ //stabilisation iBleedAmt = -iBleedAmt; PlayVoiceChat(VOICE_CHAT_LAUGH); SendMessageToPC(oDying, "Vous avez reussi a vous stabiliser et commencez doucement a vous remettre."); }else{ switch (d6()){ case 1: PlayVoiceChat(VOICE_CHAT_PAIN1); break; case 2: PlayVoiceChat(VOICE_CHAT_PAIN2); break; case 3: PlayVoiceChat(VOICE_CHAT_PAIN3); break; case 4: PlayVoiceChat(VOICE_CHAT_HEALME); break; case 5: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break; case 6: PlayVoiceChat(VOICE_CHAT_HELP); } } } if(GetCurrentHitPoints() <= 0){ SetLocalInt(oDying, "iPCDCC", iDC); DelayCommand(6.0,bleed(iBleedAmt)); } else { //fin du coma int i; object oAttacker = GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,oDying, i); while(GetIsObjectValid(oAttacker) && GetDistanceToObject(oAttacker) < 20.0){ if(!GetIsInCombat(oAttacker)) DelayCommand(IntToFloat(Random(6)),AssignCommand(oAttacker,DetermineCombatRound())); oAttacker = GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,oDying, ++i); } } } } void main(){ object oDying = GetLastPlayerDying(); SetLocalObject(oDying, "PCName", oDying); SetLocalInt(oDying, "iPCDCC", 0); AssignCommand(oDying, ClearAllActions()); AssignCommand(oDying, bleed(1)); } note de finipe : pense aux balises [ nwscript] et [ /nwscript] (sans les espaces) pour mettre du code dans ton message, c'est vachement plus bô |
Revenir en haut | |
Stan Grand Chevalier Messages: 126 |
Je suis peut-être dans l'erreur mais une perte d'xp et un objet détruit c'est mieux de mettre ça dans le onplayerdeath.
Car même quand on se fait rez, on active ce script. Tu peux poster ton OnPlayerDeath ? (en balise nwnscript stp cette fois ) |
Revenir en haut | |
Yan the salor Seigneur Messages: 151 |
Voilà comme demandé mon onplayerdeath
NWScript : #include "NW_I0_GENERIC" void bleed(int iBleedAmt) { //OnDeath personnalise #include "rav_include" void ClearAllFactionMembers(object oMember, object oPlayer) { // AssignCommand(oMember, SpeakString("here")) ; AdjustReputation(oPlayer, oMember, 100); SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad object oClear = GetFirstFactionMember(oMember, FALSE); while (GetIsObjectValid(oClear) == TRUE) { ClearPersonalReputation(oPlayer, oClear); oClear = GetNextFactionMember(oMember, FALSE); } } void main() { object oPlayer = GetLastPlayerDied(); //Ajouter le joueur a la liste des morts et incrementer le nombre de morts object module = GetModule(); int numdead = GetLocalInt(module, "numdead"); numdead++; SetLocalInt(module, "numdead", numdead); SetLocalObject(module,"deadplayer"+IntToString(numdead),oPlayer); // * Handle Spirit of the Wood Death string sArea = GetTag(GetArea(oPlayer)); /* if (sArea == "MAP_M2Q2F2" && GetDistanceBetweenLocations(Ge tLocation(GetObjectByTag(" ;M2Q2F2_M2Q2G")), GetLocation(oPlayer)) < 5.0 && GetLocalInt(GetModule()," NW_M2Q2E_WoodsFreed") == 0) { int bValid; Raise(oPlayer); string sDestTag = "WP_M2Q2GtoM2Q2F"; object oSpawnPoint = GetObjectByTag(sDestTag); AssignCommand(oPlayer,JumpToLo cation(GetLocation(oSpawnPoint ))); return; } */ // * in last level of the Sourcestone, move the player to the beginning of the area // * May 16 2002: or the main area of the Snowglobe (to prevent plot logic problems). // * May 21 2002: or Castle Never if (sArea == "M4Q1D2" || sArea == "M3Q3C" || sArea == "MAP_M1Q6A") { //Raise(oPlayer); //string sDestTag = "M4QD07_ENTER"; //object oSpawnPoint = GetObjectByTag(sDestTag); // AssignCommand(oPlayer, DelayCommand(1.0, JumpToLocation(GetLocation(oSp awnPoint)))); // * MAY 2002: Just popup the YOU ARE DEAD panel at this point DelayCommand(2.5, PopUpDeathGUIPanel(oPlayer,FALSE, TRUE, 66487)); return; } // * make friendly to Each of the 3 common factions AssignCommand(oPlayer, ClearAllActions()); // * Note: waiting for Sophia to make SetStandardFactionReptuation to clear all personal reputation if (GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oPlayer) <= 10) { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 80, oPlayer); } if (GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oPlayer) <= 10) { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 80, oPlayer); } if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) <= 10) { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 80, oPlayer); } DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH)); }} |
Revenir en haut | |
Stan Grand Chevalier Messages: 126 |
Premiere question toute bête :
NWScript :
if (sArea == "M4Q1D2" || sArea == "M3Q3C" || sArea == "MAP_M1Q6A") { DelayCommand(2.5, PopUpDeathGUIPanel(oPlayer,FALSE, TRUE, 66487)); return; } Elles ont quoi ces maps de spécial pour interdire un respawn du joueur ? Est-ce un module multi ? si oui tes joueurs vont peut-être pas aimer d'être bloqué sur ces 3 cartes là 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. à la suite de ça par exemple tu peux mettre la perte d'xp, il la perdra avant même de voir son panneau d'attente ou de respawn. 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. On lui fait perdre son niveau * 140. PS : attention cette méthode permet de level down, si tu ne veux pas qu'ils level down, précise le il faudra changer le script. *va préparer le script de destruction d'item* Edit : après courte réfléxion on a plusieurs options à décider.Veux tu que le PJ ait une chance d'échapper à la destruction ou doit on fouiller tout son équipement porté jusqu'à trouver un truc à supprimer ? (cad si t'as juste une arme et une armure, l'un des deux se fait supprimer) Doit-on s'occuper de tous les joueurs ? meme les levels 1 ? (cette question se pose dans le cas où tu déciderais qu'obligatoirement un item soit supprimé, car un pauvre level 1 avec une armure et une arme, deux mort et il est à poil sans or) L'item doit-il être supprimé ou juste droppé pour laisser une chance de le récuperer ? |
Revenir en haut | |
Lisan Anthelus Chevalier Messages: 73 Localisation: Lyon (FRANCE) |
A la question toute bête de Stan, le script en question est customisé.
Il s'agit d'un bout de script de la campagne officielle SOU (on y lit ,d'ailleurs, les commentaires au dessus faisant référence à la pierre des origines et au passage dans le globe. Il y a même Castle Never qui concerne peut-être la salle où l'on va combattre Desther). _________________ Un cerveau... c'est fait pour agir. La pensée n'est là que pour rendre plus efficace l'action. H. Laborit |
Revenir en haut | |
Yan the salor Seigneur Messages: 151 |
Vraiment gentil de s'occuper de moi ainsi...
Pour la perte d'objet je voudrais un des objets porté au hasard à coups surs (genre l'armure ou l'épée ou un anneau porté). Merci encore, je teste la première partie... |
Revenir en haut | |
Stan Grand Chevalier Messages: 126 |
Voilà le script qui devrait virer un item à coup sur.J'espere qu'il fonctionne
Ecris grâce à une petite aide de kiki (encore merci kiki pour les prédéclarations). NWScript :
void vireritem(int De,object oCreature); void sup(int Slot,object oCreature, int De){ if (GetItemInSlot(Slot,oCreature)!=OBJECT_INVALID) DestroyObject(GetItemInSlot(Slot,oCreature)); //si l'objet est valide on le supprime else { int oTentative=GetLocalInt(oCreature,"tentative"); if (oTentative<12){ SetLocalInt(oCreature,"tentative",(oTentative+1)); vireritem(De+1,oCreature); } } } void vireritem(int De, object oCreature){ if (De>11) De=1; switch (De){ case 1: sup(INVENTORY_SLOT_ARMS, oCreature, De); //on vire les bracelets si possible break; case 2: sup(INVENTORY_SLOT_BELT, oCreature, De); //on vire la ceinture si possible break; case 3: sup(INVENTORY_SLOT_BOOTS, oCreature, De); //on vire les bottes si possible break; case 4: sup(INVENTORY_SLOT_CHEST, oCreature, De); //on vire l'armure si possible break; case 5: sup(INVENTORY_SLOT_CLOAK, oCreature, De); //on vire la cape si possible break; case 6: sup(INVENTORY_SLOT_HEAD, oCreature, De); //on vire le casque si possible break; case 7: sup(INVENTORY_SLOT_LEFTHAND, oCreature, De); //on vire l'objet main gauche si possible break; case 8: sup(INVENTORY_SLOT_LEFTRING, oCreature, De); //on vire l'anneau gauche si possible break; case 9: sup(INVENTORY_SLOT_NECK, oCreature, De); //on vire l'amulette si possible break; case 10: sup(INVENTORY_SLOT_RIGHTHAND, oCreature, De); //on vire l'objet main droite si possible break; case 11: sup(INVENTORY_SLOT_RIGHTRING, oCreature, De); //on vire l'objet main gauche si possible break; }} void main(){ object oPlayer = GetLastPlayerDied(); SetLocalInt(oPlayer,"tentative",1); vireritem(d8(1)+d4(1)-1,oPlayer); DeleteLocalInt(oPlayer,"tentative"); //ici tu remet le reste de ton script de ondeath } Plus qu'à prier pour que cela fonctionne car je me suis heurté à des problèmes que je n'avais pas imaginé avant de me lancer dans le script |
Revenir en haut | |
Yan the salor Seigneur Messages: 151 |
Euh ça compile pas...
Cette ligne là, il me dit: 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.
UNKNOWN STATE IN COMPILER J'ai tout mis à la suite de 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. Qu'est-ce que t'en pense? |
Revenir en haut | |
Yeziliclick Seigneur Messages: 235 |
la déclaration des fonctions se fait en dehors du main si je me rappelle bien mes cours de prog.
|
Revenir en haut | |
Yan the salor Seigneur Messages: 151 |
bé oui, ça compile, je vais tester ça merci.
TROP GENIAL ça FONCTIONNE, vraiment merci, je suis super content (non non je vais pas vomir...) Merci à vous deux. je recommande le script si quelqu'un veut s'en servir. Dernière édition par Yan the salor le 12/04/2005 12:18:11; édité 1 fois
|
Revenir en haut | |
Stan Grand Chevalier Messages: 126 |
J'aimerais juste savoir si cela fonctionne réellement, car que ça compile ça je le savais déjà
A tester aussi avec un PJ totalement nu, voir si la boucle se termine réellement. Oui faut effectivement déclarer les "3" fonctions avant le main, comme je l'ai fais sur mon post. |
Revenir en haut | |
Yan the salor Seigneur Messages: 151 |
Oui, pas de pblm, ça fonctionne nickel, merci.
|
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Page 1 sur 1 ¤
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