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 22:57:59
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 |
Inquisiteur-Loh Acolyte Messages: 22 |
Posté le : 18/08/2005 01:54:26 Sujet du message : OnPlayerDeath, chasseur de primes (et autres joies)
Bonjour, voici un script que j'ai mis dans le OnPlayerDeath d'un module multijoueur.
Le script est sencé à la mort d'un personnage :1- Vérifier si l'objet de tag "contrat" possédé par le PJ tué possède la variable "hitme" supérieure ou égale à 1. 2- Vérifier si la créature qui l'a séché est un Personnage Joueur (PC) Si ces deux conditions sont réunies : 1- On augmente la variable "gob" de l'objet "contrat" détenu par le tueur de la valeur "hitme" de l'objet "contrat" possédé par le PJ tué. 2- On remet à zéro la valeur "hitme" de l'objet "contrat" possédé par le PJ tué. 3- On incrémente de 1 la variable "killer" de l'objet "contrat" possédé par le tueur. 4- On incrémente de 1 la variable "morts" de l'objet "contrat" possédé par le PJ tué. 5- Le mort crie "Le personnage <tueur> a obtenu une prime de <variable "hitme"> PO en me tuant. Il n'y a plus de prime sur ma tête". Voici le script (c'est le script de base avec un rajout, je m'inquiete surtout de l'efficacité du GetLastKiller() sur le script OnPlayerDeath. Notez que le script compile. NWScript :
//:///////////////////////// ///////////////////// //:: Death Script //:: NW_O0_DEATH.NSS //:: Copyright (c) 2001 Bioware Corp. //:///////////////////////// //////////////////// /* This script handles the default behavior that occurs when a player dies. BK: October 8 2002: Overriden for Expansion */ //:///////////////////////// //////////////////// //:: Created By: Brent Knowles //:: Created On: November 6, 2001 //:///////////////////////// //////////////////// /* void ClearAllFactionMembers(object oMember, object oPlayer) { // AssignCommand(oMember, SpeakString("here")) ; AdjustReputation(oPlayer, oMember, 100); SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad&qu ot;, 10); // * Player bad object oClear = GetFirstFactionMember(oMember, FALSE); while (GetIsObjectValid(oClear) == TRUE) { ClearPersonalReputation(oPlaye r, oClear); oClear = GetNextFactionMember(oMember, FALSE); } } */ void Raise(object oPlayer) { effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION); effect eBad = GetFirstEffect(oPlayer); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer); //Search for negative effects while(GetIsEffectValid(eBad)) { if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS || GetEffectType(eBad) == EFFECT_TYPE_DEAF || GetEffectType(eBad) == EFFECT_TYPE_PARALYZE || GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL) { //Remove effect if it is negative. RemoveEffect(oPlayer, eBad); } eBad = GetNextEffect(oPlayer); } //Fire cast spell at event for the specified target SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE)); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer); } void main() { //Mode chasseur de primes, verifie si le PJ avait une prime sur lui... object oPlayer = GetLastPlayerDied(); object oKiller = GetLastKiller(); int nInt; nInt = GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme"); if ((GetIsPC(oKiller)) && (GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme") >= 1)) { int nLoh; nLoh = GetLocalInt(GetItemPossessedBy(oKiller, "contrat"), "gob"); string sPrime = IntToString(nInt); string sTueur = GetName(oKiller); string sAccount = GetPCPlayerName(oPlayer); nLoh += nInt; SetLocalInt(GetItemPossessedBy(oKiller, "contrat"), "gob", nLoh);//Recompense le tueur qui ira toucher la tune chez le chasseur de primes SetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme", 0);//Annule la prime mise sur la tete du joueur SpeakString("Le personnage " + sTueur + "(" + sAccount + ") a obtenu une prime de" + sPrime + " PO en me tuant. Il n'y a plus de prime sur ma tete", TALKVOLUME_SHOUT);//Le gueule sur tous les toits //Ajoute un meurtre au sanglant compteur du tueur int nDied; nDied = GetLocalInt(GetItemPossessedBy(oKiller, "contrat"), "killer"); nDied += 1; SetLocalInt(GetItemPossessedBy(oKiller, "contrat"), "killer",nDied); } //Compteurs de nombre de fois ou le PJ s'est fait tuer... //Stocke dans la variable "morts" int nDeath; nDeath = GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "morts"); nDeath += 1; SetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "morts",nDeath); // * increment global tracking number of times that I died SetLocalInt(oPlayer, "NW_L_PLAYER_DIED", GetLocalInt(oPlayer, "NW_L_PLAYER_DIED") + 1); // * BK: Automation Control. Autopcs ignore death if (GetLocalInt(oPlayer, "NW_L_AUTOMATION") == 10) { Raise(oPlayer); DelayCommand(1.0, ExecuteScript("crawl", OBJECT_SELF)); return; // Raise and return } // * 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)); } Je vous remercie par avance de vos conseils et réponses. Inki. _________________ Inquisiteur Loh |
Revenir en haut | |
Elandil2 Chevalier Messages: 97 Localisation: sur mon ordi loir-et-cher |
Salut a toi.
je n'en sais rien mais je suppose : tu utilise "while" pour rechercher tous les effets présent sur ton PJ (ce qui est très judicieux) mais une fois que tous les effets que tu veux enlever le seront, si il reste des effets mais que tu ne veux pasz enlever, il va pourtant continuer a chercher les effets ... et ce sans fin, ce qui à la longue rend ce script très lourd pour ton moduule ... Mais ceci n'est qu'une supposition elle est a vérifier ... Sinon tu peux gagner un^peu de place dans ton script : NWScript :
nInt = GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme"); if ((GetIsPC(oKiller)) && (GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme") >= 1)) A transformer en ça : NWScript :
nInt = GetLocalInt(GetItemPossessedBy(oPlayer, "contrat"), "hitme"); if ((GetIsPC(oKiller)) && nInt >=1) A part ça, ça m'a l'air plutot très bien ! ^^ _________________ Rejoignez nous sur notre forum Aelor, module en construction Vive Gimli |
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