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 18:20:20
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 |
Attention ! | Vous êtes en train de lire un message hors de son contexte. Veuillez lire le sujet Économie de ressources en entier avant de répondre à ce message. |
AZAZEL11 Seigneur Messages: 156 |
Bonjour, enfin je suis heureux de ne pas avoir un problème mais juste d'avoir besoin de vos avis^^. Bon voilà, tout le monde sait qu'il est toujours préférable de ne pas placer une multitude de pnjs pour des raisons de IA à gérer par le host. J'ai peut être une solution quant aux pnjs, j'ai pensé de mettre tous mes pnjs en *spawn* par script dans le OnEnter de la zone. Et j'ai aussi mis le script de *balayage* dans le OnUserDefined de la zone également. Donc ainsi une zone vide de PJs se retrouve automatiquement sans pnjs à l'intérieur de cette dernière.
Le principe du spawn marche avec des points de passage. Le point de passage déterminant la position et l'orientation qu'aura le pnj concerné. De la façon que j'ai fait le script on doit placer chaque point de passage avec un tag unique. Je vous montre les 2 scripts et j'aimerais savoir si c'est efficace en économie de ressources avec le procédé que j'utilise (car c'est pénible quelque peu à appliquer pour chaque zone on s'entend là dessus...). Et surtout, savoir si mon script du OnEnter ne pourrait être pas plus simple (en utilisant le même tag de tous les points de passage pour la zone pour la même créature avec une commande spécifique du genre, GetNextItemInArea). Tappez pas si j'ignore les bases des commandes élémentaires du scriptage mais je parviens enfin à décoder, mais je ne suis aucunement familier avec les commandes *raccourcis*. Bon voici, pour le OnEnter: (un exemple pour 3 gardes identiques, meme resref mais qui doivent avoir un point de passage unique *le p'tit problème...*) NWScript :
//cree par Azazel, le 16 mars 2006 // script de spawn des pnjs de la zone // a mettre dans le OnEnter de la zone void main() { object oTarget; object oPC = GetEnteringObject(); object oSpawn; location lTarget; lTarget = GetLocation(oTarget); if (!GetIsPC(oPC)) return; { ExploreAreaForPlayer(GetArea(oPC), oPC); oTarget = GetObjectByTag("222"); //tag des points de passages oTarget = GetWaypointByTag("222"); //idem oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "lancierleilon002", lTarget); lTarget = GetLocation(oTarget); oTarget = GetObjectByTag("223"); oTarget = GetWaypointByTag("223"); oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "lancierleilon002", lTarget); lTarget = GetLocation(oTarget); oTarget = GetObjectByTag("224"); oTarget = GetWaypointByTag("224"); oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "lancierleilon002", lTarget); } } Et pour le OnUserDefined: NWScript : //://////////////////////////////////////////////
Le code a colorer syntaxiquement est trop long (plus de 10240 caractères) et risque de ne pas s'afficher du tout. Vous pouvez le voir en version colorée ici.//:: Area Onuserdefined //:///////////////////////////////////////////// /* Place this script in the area userdefined event case 2998: sets skybox depending on weather (only while PCs are in the area) case 2999: checks how many PCs are in the area. (when a PC enters and every 5 minutes there after, unless the area is empty) case 3000: wipes the area clean of items, creatures, drops, and resets the encounters. (60 seconds after the last player leaves the area or when case 2999 finds 0 PCs in the area) case 3001: Boolean Logic used with 2999 case 3002: Generic NPC Spawner **See below for setup details** */ //:///////////////////////////////////////////// //:: Created By: Besalope //:: Created On: 12/19/04 //:///////////////////////////////////////////// void main() { int nUser=GetUserDefinedEventNumber(); switch(nUser) { case 2998: //This checks the weather type of the area every thirty seconds (but only when players are in the area) and sets the according skybox. { if(GetLocalInt(OBJECT_SELF,"PCs_In_Area")>= 1) //this sets the area to only check the weather if there is a player in the area { int nWeather = GetWeather(OBJECT_SELF); switch(nWeather) { case WEATHER_CLEAR: { SetSkyBox(SKYBOX_GRASS_CLEAR); break; } case WEATHER_RAIN: { SetSkyBox(SKYBOX_GRASS_STORM); break; } case WEATHER_SNOW: { SetSkyBox(SKYBOX_ICY); break; } } DelayCommand(180.0f,SignalEvent(OBJECT_SELF,EventUserDefined(2998))); //the delay command sets how often the area is checked while a player is in the area. } break; } case 2999: //case 2999 was added to ensure that the number of PCs in the area is as accurate as possible { SetLocalInt(OBJECT_SELF,"PCs_Found",0); object oPC = GetFirstObjectInArea(); while(GetIsObjectValid(oPC)) { if(GetIsPC(oPC) == TRUE) //removed DM check v1.28 { SetLocalInt(OBJECT_SELF,"PCs_Found",GetLocalInt(OBJECT_SELF,"PCs_Found")+1); } oPC = GetNextObjectInArea(); } if(GetLocalInt(OBJECT_SELF,"PCs_Found") != GetLocalInt(OBJECT_SELF,"PCs_In_Area")) { SetLocalInt(OBJECT_SELF,"PCs_In_Area",GetLocalInt(OBJECT_SELF,"PCs_Found")); } if(GetLocalInt(OBJECT_SELF,"PCs_Found") == 0) { SignalEvent(OBJECT_SELF,EventUserDefined(3000)); SetLocalString(OBJECT_SELF,"PC Tracker Ran","False"); } else { DelayCommand(300.0f,SignalEvent(OBJECT_SELF,EventUserDefined(2999))); } break; } case 3000: { object oArea = GetArea(OBJECT_SELF); object oChk = GetFirstObjectInArea(oArea); while(GetIsObjectValid(oChk) && (GetLocalInt(OBJECT_SELF,"PCs_In_Area") == 0)) { int nChk = GetObjectType(oChk); switch(nChk) { case OBJECT_TYPE_CREATURE: { SetImmortal(oChk,FALSE); SetPlotFlag(oChk,FALSE); DelayCommand(0.1f,DestroyObject(oChk)); break; } //* case OBJECT_TYPE_ITEM: // { // SetImmortal(oChk,FALSE); // SetPlotFlag(oChk,FALSE); // DelayCommand(0.1f,DestroyObject(oChk)); // break; // } // case OBJECT_TYPE_PLACEABLE: // { // if(GetStringLowerCase(GetName(oChk)) == "remains") // { // object oItem = GetFirstItemInInventory(oChk); // while(GetIsObjectValid(oItem)) // { // DestroyObject(oItem); // oItem = GetNextItemInInventory(oChk); // } // AssignCommand(oChk,SetIsDestroyable(TRUE)); // DestroyObject(oChk); // } // break; // } } oChk = GetNextObjectInArea(oArea); } object oObject = GetFirstObjectInArea(GetArea(OBJECT_SELF)); while(GetIsObjectValid(oObject) && (GetLocalInt(OBJECT_SELF,"PCs_In_Area") == 0)) { if (GetObjectType(oObject) == OBJECT_TYPE_ENCOUNTER) { SetEncounterActive(TRUE, oObject); } oObject=GetNextObjectInArea(); } break; } case 3001: //added v1.28 Boolean logic check { if(GetLocalString(OBJECT_SELF,"PC Tracker Ran") == "False") // Part of the boolean logic check v1.28 - This is the part that makes sure it hasn't already been triggered { SetLocalString(OBJECT_SELF,"PC Tracker Ran","True"); // Part of the boolean logic check v1.28 - Indicates that the tracker has been activated SignalEvent(OBJECT_SELF,EventUserDefined(2999)); } else { return; } break; } case 3002: //added v1.30 Generic NPC Spawner /* Generic NPC Spawner Configuration 1. Create a Waypoint at Spawn Location 2. Define the creature to spawn by naming the Waypoint: SPWN_[resref of creature you want to spawn] i.e. SPWN_waterdhavianguar 3. Next, define the type of NPC types include [Waypoint Walkers, Posted, Sitting, and Merchant] To define the type one of the following to the start of the Waypoint's Tag: WP_ POST_ SIT_ MER_ NIGHT_ DAY_ NORM_ 4. Now you define the NPC's Tag (add whatever you want after the definer from step 3) - TAG MUST BE UNIQUE! i.e. POST_waterdhavianguard1 4a. If you want a Waypoint walker, add _01 to the end of the tag i.e. WP_waterdhavianwatcher1_01 */ { object oSP = GetFirstObjectInArea(); string nOSPTag = ""; while(GetIsObjectValid(oSP)) { if(GetTag(oSP) == nOSPTag) { oSP = GetNextObjectInArea(); } else { if((GetObjectType(oSP) == OBJECT_TYPE_WAYPOINT) || (GetObjectType(oSP) == OBJECT_TYPE_STORE)) { if(GetStringUpperCase(GetStringLeft(GetName(oSP),5)) == "SPWN_") { string nresref = GetStringRight(GetName(oSP),GetStringLength(GetName(oSP))-5); if(GetStringUpperCase(GetStringLeft(GetTag(oSP),3)) == "WP_") //Spawner for Waypoint Walkers { string sSPTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-3); string sNPCTag = GetStringLeft(sSPTag,GetStringLength(sSPTag)-3); CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag); } if(GetStringUpperCase(GetStringLeft(GetTag(oSP),5)) == "POST_") //Spawner for posted NPCS { string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-5); CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag); } if(GetStringUpperCase(GetStringLeft(GetTag(oSP),4)) == "SIT_") //Spawner for sitting NPCS { string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-4); CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag); DelayCommand(0.5f,AssignCommand(GetObjectByTag(sNPCTag),ActionSit(GetNearestObjectByTag("Chair")))); } if(GetStringUpperCase(GetStringLeft(GetTag(oSP),4)) == "MER_") //Spawner for Merchant NPCS { string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-4); CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag); if(GetStoreGold(oSP) <= 1000) { SetStoreGold(oSP,100000); } } if(GetStringUpperCase(GetStringLeft(GetTag(oSP),6)) == "NIGHT_") //Spawner for Night-Only NPCs { if((GetTimeHour() >= 1 || (GetTimeHour() <= 6)) //change times as per your module { string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-6); CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag); } } if(GetStringUpperCase(GetStringLeft(GetTag(oSP),4)) == "DAY_") //Spawner for Day-Only NPCs { if((GetTimeHour() <= 1 && (GetTimeHour() >= 6)) //change times as per your module { string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-4); CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag); } } if(GetStringUpperCase(GetStringLeft(GetTag(oSP),5)) == "NORM_") //Spawner for Normal NPCs that do not need any special treatment { string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-5); CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag); } } } nOSPTag = GetTag(oSP); oSP = GetNextObjectInArea(); } } break; } break; } } _________________ L'imagination est plus importante que le savoir. (Albert Einstein) |
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