World of Gothic Archiv
> NWN-Hilfe Scriptsammlung |
|
09.07.2002, 21:29 | #1 | ||||
Gawain15 Beiträge: 1.084 |
Scriptsammlung
Moinsen, ich hab mal den 1000. Post als Anlass genommen alle bisher hier geposteten Skripte in einem Thread zusammen zu fassen (naja einige haben ja auch mal angefragt ob es eine Skript-Datenbank gibt... naja hier mal eine Unterart davon :) ). Wenn ihr Fragen zu einzelnen Skripten habt bitte nicht direkt hier rein posten sondern das Script nehmen und Frage in einem neuen Thread posten damit dieser Thread nicht "Überquillt". Thx Gawain alias Ezekiel :) wenn jemand nicht damit einverstanden ist das ich sein Script hier einfach so gepostet hab bitte mir bescheid geben ich nehms dann wieder aus der Liste raus. --- Ein NPC soll sich hinsetzen: void main() { int nChair = 1; object oChair; oChair = GetNearestObjectByTag("Tag des Stuhls", OBJECT_SELF, nChair); //Tag des Stuhls durch die Kennzeichnung eures Stuhls ersetzen. ActionSit(oChair); } --- Ein NPC sagt einen Zufallssatz beim anklicken: void main() { string sRandom; int iRandom = Random(5); if (iRandom == 1){ sRandom = "Beispielsatz 1";} //Beispielatz durch euren Satz ersetzen. else if (iRandom == 2){ sRandom = "Beispielsatz 2";} else if (iRandom == 3){ sRandom = "Beispielsatz 3";} else if (iRandom == 4){ sRandom = "Beispielsatz 4";} else if (iRandom == 5){ sRandom = "Beispielsatz 5";} ActionSpeakString (sRandom, TALKVOLUME_TALK); } --- Ein NPC sagt etwas wenn man erfolgslos versucht eine Tür zu öffnen (bei OnFailToOpen einfügen): void main() { object oNPC = GetObjectByTag("tuerwache"); // tuerwache : Kennzeichnung Des NPCs der es sagen soll. AssignCommand(oNPC, SpeakString("Dein Satz hier rein.")); } --- Eine Kreatur flüchtet vor dem Spieler (je nach gebrauch entsprechend bei der Kreatur einfügen): void main() { object oTarget = GetLastPerceived(); if (GetLastPerceptionSeen() == TRUE) { if (GetIsPC(oTarget)) { ClearAllActions(); ActionMoveAwayFromObject(oTarget,TRUE); } } } --- Dieses Skript ist für Schilder und Wegweiser geeignet bei OnUse einfügen. void main() { AssignCommand(OBJECT_SELF, SpeakString("Dein Satz hier rein.")); } --- Dieses Skript zeigt eine Nachricht sobald der Spieler das entsprechende Gebiet betritt, unter den Gebietseigenschaften bei OnEnter einfügen. void main() { object oTriggerer; oTriggerer = GetEnteringObject(); SendMessageToPC(oTriggerer, "TEXT HIER REIN"); } --- Damit eine Kreatur schläft, folgendes bei OnSpawn einfügen: void main() {ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectSleep(), OBJECT_SELF); } --- Der Spieler sagt etwas sobald er ein bestimmtes Gebiet bertitt (bei OnEnter des Triggers einfügen): void main() { object oPC = GetEnteringObject(); if( (GetIsPC(oPC)) && (GetLocalInt(OBJECT_SELF, "iGesprochen") != 1)) { AssignCommand(oPC, ClearAllActions()); SetLocalInt(OBJECT_SELF, "iGesprochen", 1); AssignCommand(oPC, SpeakString("Verdammt, sie haben uns in einen Hinterhalt gelockt!", TALKVOLUME_SHOUT)); } } --- Kreatur spawned tot und die Leiche bleibt liegen (also quasi eine Leiche) bei der Kreatur unter OnSpawn einfügen: void main() { ActionDoCommand(SetIsDestroyable(FALSE)); ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDeath(), OBJECT_SELF)); } --- Eine Tür schließt sich und verschließt sich wieder nachdem sie geöffnet wurde (Bei OnHeartbeat einfügen): void main() { if(GetIsOpen(OBJECT_SELF)) { ActionWait(3.0); // Die Zeit die die Tür offen stehen soll. ActionCloseDoor (OBJECT_SELF); } if(GetLockLockable(OBJECT_SELF) && !GetLocked(OBJECT_SELF) && !GetIsOpen(OBJECT_SELF)) { SetLocked(OBJECT_SELF, TRUE); } } --- Einen Begegnungstrigger erst nach einer bestimmten Aktion aktivieren: void main() { object oBegegnung = GetObjectByTag("DeinSpawn"); SetEncounterActive(TRUE, oBegegnung); } --- Ein counter der zählt wieviele man getötet hat (bei OnDeath der Kreatur einfügen): void main() { SetLocalInt(GetLastKiller(), "Name int variable", GetLocalInt(GetLastKiller(), " Name int variable") + 1); } --- Sobald ein NPC den Spieler sieht wird er angesprochen (bei OnPerception der Kreatur einfügen) void main() { object oNPC = GetObjectByTag("dein nsc"); object oPC = GetLastPerceived(); if( (GetIsPC(oPC)) && (IsInConversation(oNPC) == FALSE) && (GetObjectSeen(oPC,oNPC)) && (GetLocalInt(OBJECT_SELF, "iGesprochen") != 1)) { AssignCommand(oPC, ClearAllActions()); AssignCommand(oNPC, ClearAllActions()); AssignCommand(oNPC, ActionMoveToObject(oPC)); AssignCommand(oNPC, ActionStartConversation(oPC)); SetLocalInt(OBJECT_SELF, "iGesprochen", 1); } } --- Eine Kreatur in der Gegend rumlaufen lassen (bei OnSpawn bei der Kreatur einfügen): void main() { ActionRandomWalk(); } --- Damit der Spieler die gesammte Karte eines Gebietes hat folgendes bei den Gebietseigenschaften unter OnEnter einfügen: Der Spieler braucht die Karte damit er das gesammte Gebiet sieht: void main() { object oSpieler = GetEnteringObject(); string sKartenTag = "MeineKarte"; object oKarte = GetItemPossessedBy(oSpieler, sKartenTag); object oArea = GetArea(OBJECT_SELF); if (GetIsObjectValid(oKarte)) { ExploreAreaForPlayer(oArea,oSpieler); } } Der Spieler sieht das gesamte Gebiet, auch ohne Karte: void main() { object oSpieler = GetEnteringObject(); object oArea = GetArea(OBJECT_SELF); ExploreAreaForPlayer(oArea,oSpieler); } --- Folgendes bei erfolgte Aktionen am Ende eines Gesprächs einfügen damit der NPC zu dem Wegpunkt geht und danach verschwindet: void main() { object oDeinWegpunkt = GetObjectByTag("Yesyesyo"); ActionMoveToObject(oDeinWegpunkt, TRUE); ActionDoCommand(DestroyObject(OBJECT_SELF)); } --- Damit ein NPC vor und nach einem Gespräch in der Gegend rumläuft folgendes bei OnHeartbeat des NPCs einfügen: if (IsInConversation(OBJECT_SELF)) ActionWait (6.0); else ActionRandomWalk(); --- Damit ein NPC eine Tür öffnet, folgendes bei Erfolgte Aktionen bei der Konversation einfügen: void main() { object oTuer = GetObjectByTag("Deine Tür"); ActionUnlockObject(oTuer); ActionOpenDoor(oTuer); } --- Damit ein Hebel o.ä. eine Tür öffnet folgendes bei OnUsed des Hebels einfügen: void main() { object oDoor = GetNearestObjectByTag("Tuer"); AssignCommand(oDoor,ActionOpenDoor(oDoor)); SpeakString("Die Tuer hat sich geoeffnet!"); } --- Eine Kreatur betet (Wie Norick im Tyr Tempel) (Bei OnHeartbeat der Kreatur vor der letzten Klammer einfügen, "Beten" ist die Kennzeichnung des anzubetenden Gegenstandes. Kann man auch weglassen): object oBeten = GetNearestObjectByTag("Beten"); if (IsInConversation(OBJECT_SELF) || GetIsInCombat(OBJECT_SELF)) ActionWait (6.0); else ClearAllActions(); ActionDoCommand(SetFacingPoint(GetPosition(oBeten))); ActionDoCommand(PlayAnimation(ANIMATION_LOOPING_MEDITATE,1.0,7.0)); --- Der Spieler wird geheilt, wie in der Kampagne beim Tempel, unter "Erfolgte Aktionen" im Konversationseditor einfügen, an der Stelle wenn der Spieler geheilt werden soll (z.B. "Ich benötige Heilung") void FakeRestore(object oTarget); void main() { object oPC = GetPCSpeaker(); object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN,oPC); object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oPC); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oPC); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED,oPC); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED,oPC); ActionPauseConversation(); ActionCastFakeSpellAtObject(SPELL_GREATER_RESTORATION, OBJECT_SELF); ActionDoCommand(FakeRestore(oPC)); if(GetIsObjectValid(oHenchman)) { ActionDoCommand(FakeRestore(oHenchman)); // checks to see if they have any cure crital wound potions; if not, creates it on them. if (!GetIsObjectValid(GetItemPossessedBy(oHenchman,"NW_IT_MPOTION003"))) { CreateItemOnObject("NW_IT_MPOTION003",oHenchman,3); } } if(GetIsObjectValid(oAnimal)) { ActionDoCommand(FakeRestore(oAnimal)); } if(GetIsObjectValid(oFamiliar)) { ActionDoCommand(FakeRestore(oFamiliar)); } if(GetIsObjectValid(oDominated)) { ActionDoCommand(FakeRestore(oDominated)); } if(GetIsObjectValid(oSummoned)) { ActionDoCommand(FakeRestore(oSummoned)); } ActionResumeConversation(); } void FakeRestore(object oTarget) { effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION_GREATER); effect eBad = GetFirstEffect(oTarget); //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_CURSE || GetEffectType(eBad) == EFFECT_TYPE_DISEASE || GetEffectType(eBad) == EFFECT_TYPE_POISON || GetEffectType(eBad) == EFFECT_TYPE_PARALYZE || GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL) { //Remove effect if it is negative. RemoveEffect(oTarget, eBad); } eBad = GetNextEffect(oTarget); } if(GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD) { //Apply the VFX impact and effects int nHeal = GetMaxHitPoints(oTarget) - GetCurrentHitPoints(oTarget); effect eHeal = EffectHeal(nHeal); if (nHeal > 0) ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget); } ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oTarget); } --- Der Spieler kann sich seine eigenen Sachen schmieden. - wir brauchen am besten einen amboss (platzierbare gegenstände, handel). gebt ihm als kennzeichnung "amboss". dann wählt ihr unten noch handlung, benutzbar und hat gepäck, bei der beschreibung könnt ihr noch irgendwas von magischen kräften oder so hinschreiben - dann brauchen wir einen schmiedehammer, mit diesem werden wir später (wie der name schon sagt) die gegenstände schmieden. als itemtyp nehmen wir den leichten hammer, als kennzeichnung am besten "schmiedehammer" und noch "handlung" wählen. bei aussehen, beschreibung könnt ihr irgendwas beliebiges nehmen, ebenso bei den magischen eigenschaften, hier bietet sich zb. was an, dass diesen hammer jeder benutzen kann (natürlich nur wenn ihr wollt dass irgendwelche arroganten magier da rumschmieden) fügt beim "onphysicalattacked"-script des ambosses (wird ausgeführt sobald jemand den amboss angreift bzw. "schmiedet ) folgendes script ein: #include "array" //die arrayfunktionen von noel string CheckRecipes(object oItem1,object oItem2); void main() { object oAttacker = GetLastAttacker(OBJECT_SELF); //der "schmied" object oWeapon = GetLastWeaponUsed(oAttacker); //die waffe object oAmboss = GetObjectByTag("amboss"); //der amboss string sCode; //der itemcode des resultats - falls die zutaten stimmen if(oWeapon == OBJECT_INVALID) return; //wenn er keine waffe hat, hoer auf if(oWeapon == GetObjectByTag("schmiedehammer")) //wenn die waffe aber der schmiedehammer is mach weiter { object oItem1 = GetFirstItemInInventory(oAmboss); if(oItem1 == OBJECT_INVALID) return; //schau dir das erste item auf dem amboss an, wenn es keins gibt, hoer auf object oItem2 = GetNextItemInInventory(oAmboss); if(oItem2 == OBJECT_INVALID) return; //schau dir das zweite an, hoer auf, falls es das nicht gibt object oItem3 = GetNextItemInInventory(); if(oItem3 != OBJECT_INVALID) return; //falls es aber noch zusaetzlich ein drittes gibt, hoer auf, wir brauchen nur 2 sCode = CheckRecipes(oItem1,oItem2); //schau ob die zutaten ein rezept ergeben if(sCode != "") //also ja (da ein itemcode uebergeben wird) { CreateItemOnObject(sCode,oAmboss); //erzeuge das item DestroyObject(oItem1); //loesche die zutaten DestroyObject(oItem2); //loesche die zutaten ActionCastSpellAtObject(SPELL_MAGE_ARMOR,oAmboss,METAMAGIC_ANY,TRUE,0,PR OJECTILE_PATH_TYPE_DEFAULT,TRUE); //mach einen huebschen effekt, weils geklappt hat (SPELL_MAGE_ARMOR is natuerlich austauschbar) AssignCommand(oAttacker,ClearAllActions()); //hoer mit dem angreifen auf SetIdentified(GetObjectByTag(sCode),1); //identifizier das ergebnis } else { ActionCastSpellAtObject(SPELL_MAGIC_MISSILE,oAttacker,METAMAGIC_ANY,TRUE ,0,PROJECTILE_PATH_TYPE_DEFAULT,TRUE); //bestrafe den schmied fuer das falsche rezept (SPELL_MAGIC_MISSILE ist ebenso austauschbar bzw. loeschbar) AssignCommand(oAttacker,ClearAllActions()); //hoer mit dem angreifen auf } } } string CheckRecipes(object oItem1,object oItem2) { int nAnzahlRezepte = 3; //hier die anzahl der rezepte einstellen int i = 0; //unwichtig //alle zutaten SetLocalArrayString(OBJECT_SELF,"aZutaten",1,"NW_IT_GEM009"); //feueropal SetLocalArrayString(OBJECT_SELF,"aZutaten",2,"NW_WSWMLS010"); //langschwert+2 SetLocalArrayString(OBJECT_SELF,"aZutaten",3,"NW_WSWMLS005"); //angurvadal SetLocalArrayString(OBJECT_SELF,"aZutaten",4,"NW_IT_MRING010"); //blutroter ring SetLocalArrayString(OBJECT_SELF,"aZutaten",5,"NW_WDBMSW002"); //doppelklingenschwert+1 SetLocalArrayString(OBJECT_SELF,"aZutaten",6,"NW_WDBMSW005"); //rotmaskenklinge SetLocalArrayString(OBJECT_SELF,"aZutaten",7,"NW_IT_MSMLMISC17"); //drachenblut SetLocalArrayString(OBJECT_SELF,"aZutaten",8,"NW_ASHMTO009"); //turmschild+3 SetLocalArrayString(OBJECT_SELF,"aZutaten",9,"NW_ASHMTO004"); //schild des drachentoeters //init recipes //rezept 1: feueropal + langschwert+2 = angurvadal SetLocalArrayInt(OBJECT_SELF,"aZutat1",1,1); SetLocalArrayInt(OBJECT_SELF,"aZutat2",1,2); SetLocalArrayInt(OBJECT_SELF,"aErgebnis",1,3); //rezept 2: blutroter ring + doppelklingenschwert+1 = rotmaskenklinge SetLocalArrayInt(OBJECT_SELF,"aZutat1",2,4); SetLocalArrayInt(OBJECT_SELF,"aZutat2",2,5); SetLocalArrayInt(OBJECT_SELF,"aErgebnis",2,6); //rezept 3: drachenblut + turmschild+3 = schild des drachentoeters SetLocalArrayInt(OBJECT_SELF,"aZutat1",3,7); SetLocalArrayInt(OBJECT_SELF,"aZutat2",3,8); SetLocalArrayInt(OBJECT_SELF,"aErgebnis",3,9); //rezepte vergleichen for(i = 1;i <= nAnzahlRezepte;i++) { //korrekte zutaten und ergebnis fuer das aktuelle rezept holen string sZutat1 = GetLocalArrayString(OBJECT_SELF,"aZutaten",GetLocalArrayInt(OBJECT_SELF,"aZutat1",i)); string sZutat2 = GetLocalArrayString(OBJECT_SELF,"aZutaten",GetLocalArrayInt(OBJECT_SELF,"aZutat2",i)); string sErgebnis = GetLocalArrayString(OBJECT_SELF,"aZutaten",GetLocalArrayInt(OBJECT_SELF,"aErgebnis",i)); //wenn die gegenstaende auf dem amboss die richtigen sind, gib den itemcode des ergebnisses zurueck if(((GetTag(oItem1) == sZutat1) &&GetTag(oItem2) == sZutat2)|| (GetTag(oItem2) == sZutat1 && GetTag(oItem1) == sZutat2)) return sErgebnis; } return ""; //falls kein rezept gestimmt hat, uebergib einen leeren string } der code der datei "array" (neue scriptdatei machen, code einfügen und unter "array" speichern: /* Noel's Array stuff */ //:://///////////////////////////////////////////// //:: GetLocalArrayInt //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// /* Returns an integer, from nVarNum in the array */ //::////////////////////////////////////////////// //:: Created By: Noel //:: Created On: //::////////////////////////////////////////////// string GetLocalArrayString(object oidObject, string sVarName, int nVarNum) { string sFullVarName = sVarName + IntToString(nVarNum) ; return GetLocalString(oidObject, sFullVarName); } //:://///////////////////////////////////////////// //:: SetLocalArrayInt //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// /* Sets the integer at nVarNum position */ //::////////////////////////////////////////////// //:: Created By: Noel //:: Created On: //::////////////////////////////////////////////// void SetLocalArrayString(object oidObject, string sVarName, int nVarNum, string nValue) { string sFullVarName = sVarName + IntToString(nVarNum) ; SetLocalString(oidObject, sFullVarName, nValue); } //:://///////////////////////////////////////////// //:: GetLocalArrayInt //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// /* Returns an integer, from nVarNum in the array */ //::////////////////////////////////////////////// //:: Created By: Noel //:: Created On: //::////////////////////////////////////////////// int GetLocalArrayInt(object oidObject, string sVarName, int nVarNum) { string sFullVarName = sVarName + IntToString(nVarNum) ; return GetLocalInt(oidObject, sFullVarName); } //:://///////////////////////////////////////////// //:: SetLocalArrayInt //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// /* Sets the integer at nVarNum position */ //::////////////////////////////////////////////// //:: Created By: Noel //:: Created On: //::////////////////////////////////////////////// void SetLocalArrayInt(object oidObject, string sVarName, int nVarNum, int nValue) { string sFullVarName = sVarName + IntToString(nVarNum) ; SetLocalInt(oidObject, sFullVarName, nValue); } int StartingConditional() { return 0; } bis jetzt sind erst drei rezepte aktiviert, nämlich: feueropal + langschwert+2 = angurvadal blutroter ring + doppelklingenschwert+1 = rotmaskenklinge drachenblut + turmschild+3 = schild des drachentoeters das wird euch natürlich nicht genügen, deswegen könnt ihr natürlich noch neue rezepte reinbasteln - falls ihr neue zutaten für euer rezept braucht, müsst ihr diese noch einbasteln. dafür fügt ihr so eine zeile unter die vorhandenen zutaten: SetLocalArrayString(OBJECT_SELF,"aZutaten",x,"kennzeichnung"); //name für x setzt ihr die zahl der letzten zeile +1 ein, für kennzeichnung die entsprechende kennzeichnung des gegenstandes und name (ist optional) könnt ihr zur späteren übersicht noch den namen des gegenstandes hinschreiben. - viel interessanter sind natürlich neue rezepte dazu braucht ihr code wie den folgenden: //rezept x: zutat1 + zutat2 = ergebnis SetLocalArrayInt(OBJECT_SELF,"aZutat1",x,y); SetLocalArrayInt(OBJECT_SELF,"aZutat2",x,y); SetLocalArrayInt(OBJECT_SELF,"aErgebnis",x,y); die zeile mit dem // davor (ein kommentar) ist optional, sie ist aber ganz praktisch als orientierung für das x setzt ihr jedesmal die anzahl der rezepte +1 ein. für das y müsst ihr dementsprechend die oben verwendeten zahlen für die entsprechenden zutaten verwenden, wenn ihr jetz zum beispiel als zutat 1 sumpfbeeren (die oben zb. die zahl 11 haben) wollt, müsst ihr unten wieder diese zahl, also 11 benutzen. wenn ihr so das rezept eingetragen habt, müsst ihr noch die aktuelle anzahl der rezepte hochsetzen. setzt dazu int nAnzahlRezepte = x; eins hoch. --- Sobald der Spieler versucht zu rasten wird er von Wachen gestoppt falls sich der Spieler in ihrem Wahrnehmungsbereich befindet. folgenden code müsst ihr im "onplayerrest"-ereignis bei den moduleigenschaften (bearbeiten | eigenschaften des moduls | ereignisse) eingeben: void main() { int nLetztesMal = GetLastRestEventType(); if(nLetztesMal != REST_EVENTTYPE_REST_STARTED) return; //damit der text nicht oefter erscheint (das onplayerrest-ereignis wird beim starten, abbrechen und beenden des rastens aufgerufen (ich glaube auch bei einem fehler)) int nAnzahlWachen = 5; //hier anzahl der wachen eingeben int i = 1; object oPC = GetFirstPC(); //der spieler object oWache; //die wachen for(i = 1;i <= nAnzahlWachen;i++) { oWache = GetObjectByTag("stadtwache" + IntToString(i)); //die einzelnen wachen testen if(oWache == OBJECT_INVALID) continue; //falls es eine wache nicht gibt, mach einfach weiter if(GetObjectSeen(oPC,oWache) == TRUE || GetObjectHeard(oPC,oWache)) //wenn der spieler gehoert oder gesehen wird { AssignCommand(oPC,ClearAllActions()); //stopp das ausruhen AssignCommand(oWache,ActionMoveToObject(oPC,TRUE)); //lauf zum spieler AssignCommand(oWache,SpeakString("Ihr duerft hier nicht rasten!")); //sage dem spieler dass er nicht rasten darf return; //hoer auf } } } ihr könnt soviele stadtwachen verwenden wie ihr wollt, ihr müsst nur die anzahl bei nAnzahlWachen eingeben und die kennzeichnung der wachen muss "stadtwachex" lauten, mit dem x numeriert ihr die wachen durch (wenn sie die selbe kennzeichnung haben, wird immer nur die neueste angesprochen). das "stadtwache" könnt ihr auch ändern, wenn ihr die wachen zb. wache_x nennen wollt, einfach das "stadtwache" austauschen. was die wachen machen, könnt ihr natürlich auch noch ändern, ihr müsst nur den code bei AssignCommand(oWache,ActionMoveToObject(oPC,TRUE)); //lauf zum spieler verändern (das kann man natürlich auch weglassen ). solange das clearallactions und speakstring bleibt (aufhören mit rasten bzw. nachricht), habt ihr freie auswahl (angreifen, gold abnehmen, wegjagen... ) --- Ein NPC spricht den Spieler an sobald dieser ein bestimmtes Wort sagt. Also du machst zu erst die Kreatur die den Spieler ansprechen soll bei OnSpawn fügst du folgendes Script ein: void main() { SetListenPattern(OBJECT_SELF, "**", 777); //Die Zahl kann alles sein und ** stellt sicher das er auch alles hört SetListening(OBJECT_SELF, TRUE); //nochmal sichergehen das er auch zu hört } so und bei OnConversation fügst du das hier ein: void main() { int iHoeren = GetListenPatternNumber(); string sRufen; if(iHoeren == 777) { sRufen = GetMatchedSubstring(0); if(sRufen == "Kellner") //Das Wort oder den Satz kann man nach belieben veränder aber auf groß- und Kleinschreibung achten! { object oPC=GetFirstPC(); object oNPC=GetObjectByTag("Kellner"); //Die Kennzeichnung der Kreatur AssignCommand(oNPC, ClearAllActions()); AssignCommand(oNPC, ActionMoveToObject(oPC)); AssignCommand(oNPC, ActionStartConversation(oPC)); } } } --- hm sind ein bischen wenig... jedenfalls weniger als erwartet. Wenn ihr Skripte habt die funktionieren postet die bitte auch hier rein, dann haben wir bald eine nette Sammlung zusammen :D |
||||
09.07.2002, 22:12 | #2 | ||||
Omega Darkblade Beiträge: 257 |
Genau das was ich brauche. Danke dir |
||||
09.07.2002, 22:13 | #3 | ||||
Lzoril Beiträge: 45 |
Nach lesen dieses und des FAQ-Beitrags (und natürlich aller anderen Gawainbeiträge und Hilfestellungen) bleibt eigentlich nur eines... ne Stelle finden wo der Gawainschrein hinkommt... ich glaub auf meiner Map der Hauptstadt neben den Legionärslagern ist noch Platz |
||||
09.07.2002, 22:35 | #4 | ||||
Omega Darkblade Beiträge: 257 |
n Tempel is doch viel besser |
||||
09.07.2002, 22:38 | #5 | ||||
EisHarald Beiträge: 97 |
Ich kann mich nur nochmal wiederholen: Ein Hoch auf Gawain,der wirklich alles für dieses Forum tut So und damit auch dieses Post nicht unnütz bleibt 2 Scripts von mir. --- NPC soll sich direkt auf den Boden setzten: void main() { if(Random(3) == 0 && IsInConversation(OBJECT_SELF) == FALSE) { SpeakOneLinerConversation(); } if(IsInConversation(OBJECT_SELF) == FALSE) { ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS,1.0,4000.0); } } Einfach bei onHeartbeat des Jeweiligen NPCs rein. --- Monster soll mit dieser coolen Animation,wie die Mumie aus den Höhlen der Verdammten Spawnen: void main() { location lLoc = GetLocation(GetNearestObjectByTag("WP_tag des Waypoints")); effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD); object oMummy = CreateObject(OBJECT_TYPE_CREATURE,"Tag des Monsters das Spawnen soll",GetLocation(OBJECT_SELF)); ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVis,GetLocation(oMummy)); } Einfach einen Auslöser machen und bei onEnter rein.Dann noch einen Wegpunkt machen und ihm einen tag mit dem anfang WP_ geben. Man kann es auch bei Truhen oder ähnlichem benutzen.Dann einfach in onUsed, onOpen oder sonst irgendwas rein. --- Sind zwar beides nur etwas kleinere Scripts aber das 2. gefällt mir ganz besonders :D |
||||
09.07.2002, 23:28 | #6 | ||||
Omega Darkblade Beiträge: 257 |
ich hab hier ma was gefunden http://nwn.bioware.com/forums/viewt...&forum=47&sp=15 naja das prob is ich verstehe da nichts also ruhig weiter posten :) Achja hmm mir wer die scripts für 1. Knien/Beten (so wie Neurik im Tempel von Tyr(lezthafen) |
||||
10.07.2002, 16:04 | #7 | ||||
Gawain15 Beiträge: 1.084 |
*umkuck* *hust* *schieb* /e: Omega: Sorry, hatte deine Anfrage übersehen oder wieder vergessen... wie dem auch sei, kuck dir mal das letzte Script der Scriptsammlung an :) |
||||
10.07.2002, 16:15 | #8 | ||||
rob20 Beiträge: 17 |
Echt super die Scriptsammlung!:D |
||||
10.07.2002, 16:26 | #9 | ||||
LightHawk Beiträge: 100 |
Hi darf ich die Scrips auch in die HTML Help Datei übernehmen ? |
||||
10.07.2002, 16:44 | #10 | ||||
Gawain15 Beiträge: 1.084 |
Wie schon im "Kleinen FAQ" eigentlich-sticky-thread ( :) ) erwähnt kannst du meine gerne übernehmen, ich weiss nicht wie es mit denen aussieht die von anderen Autoren stammen. |
||||
10.07.2002, 16:49 | #11 | ||||
EisHarald Beiträge: 97 |
Meine kannst du auch übernehmen :) |
||||
10.07.2002, 19:00 | #12 | ||||
LightHawk Beiträge: 100 |
Danke :) Wenn ich damit jemanden versehendlicherweise auf den Fuß trete, kann ich den Nicknamen ja korregieren. |
||||
10.07.2002, 21:24 | #13 | ||||
Omega Darkblade Beiträge: 257 |
Heilender Springbrunnen Setzt einen Springbrunnen und mach ihn benutzbar Dann setze das sctipt unter ONUSE ein void main() { object oPC = GetLastUsedBy(); int cSpell = SPELL_HEAL; int bCheat = 1; int bInstantSpell = 1; string sSpeakString = "When you drink from the fountain, you feel your wounds start to heal."; { ActionSpeakString(sSpeakString); ActionCastSpellAtObject(cSpell, oPC, bCheat, bInstantSpell); } } Is nich von mir habs nur schnell übersetzt. |
||||
11.07.2002, 10:36 | #14 | ||||
EisHarald Beiträge: 97 |
Das Stinknormale Deathscript aus der Singleplayerkampagne ( Damit man für neu Erscheinen auch bestraft wird ;) ): //:://///////////////////////////////////////////// //:: Death Script //:: NW_O0_DEATH.NSS //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// /* This script handles the default behavior that occurs when a player dies. */ //::////////////////////////////////////////////// //:: 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", 10); // * Player bad object oClear = GetFirstFactionMember(oMember, FALSE); while (GetIsObjectValid(oClear) == TRUE) { ClearPersonalReputation(oPlayer, 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(oPl ayer)), 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() { object oPlayer = GetLastPlayerDied(); // * Handle Spirit of the Wood Death string sArea = GetTag(GetArea(oPlayer)); /* if (sArea == "MAP_M2Q2F2" && GetDistanceBetweenLocations(GetLocation(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,JumpToLocation(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(oSpawnPoint)))); // * 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)); } Bei Bearbeiten --> Eigenschaften des Moduls --> onDeath reinkopieren Einen Waypoint erstellen und ihm den Tag NW_DEATH_TEMPLE geben.Dort wo der Waypoint platziert ist wird man spawn man nach dem Tot. |
||||
11.07.2002, 11:39 | #15 | ||||
Omega Darkblade Beiträge: 257 |
Hmm kann man das auch irgentwie hinbekommen das der nicht neu spawnet? |
||||
11.07.2002, 12:32 | #16 | ||||
Gawain15 Beiträge: 1.084 |
Omega: du willst das der Charakter nicht neu spawned wenn er stirbt? Wieso das? |
||||
11.07.2002, 12:41 | #17 | ||||
Omega Darkblade Beiträge: 257 |
Hmmmm naja. Tot ist tot. Soll man doch neuladen hab ich auch immer gemacht wen mein char gestorben ist. Dann ist der Spieler auch mal n bischen vositchtiger nich nach dem moto Erstmal drauf ich komme sowieso wieder. achja mal ne ganz blöde frage: void main() { int iRandom; iRandom = Random(5); if (iRandom == 0) SpeakString("Beispielsatz 1"); //Beispielatz durch euren Satz ersetzen. if (iRandom == 1) SpeakString("Beispielsatz 2"); if (iRandom == 2) SpeakString("Beispielsatz 3 if (iRandom == 3) SpeakString("Beipsielsatz 4"); if (iRandom == 4) SpeakString("Beispielsatz 5"); } wo muss das hin? |
||||
11.07.2002, 13:11 | #18 | ||||
GuradonHellsing Beiträge: 232 |
naja kommt drauf an wenn dun npc hast der auf den pc reagieren soll packste es unter onPerception(wahrnehmung) kannst es natürlich auch unter onClick packen dann labert er wenn der spieler auf ihn klickt..... |
||||
11.07.2002, 13:19 | #19 | ||||
Omega Darkblade Beiträge: 257 |
hmmm der NSC hat kein OnClick |
||||
11.07.2002, 13:54 | #20 | ||||
Gawain15 Beiträge: 1.084 |
Yep kommt drauf an was du machen willst, OnConversation ist gleichbedeutend mit OnClick AFAIK. Aber wenn du willst das der NPC beim anklicken immer was anderes sagt mach im Konversationseditor mehrere Sachen die er sagen soll und benutz dann den Scriptwizard bei "Text erscheint wenn..." und mach zufall. Wenn du Beispielsweise 4 Sätze hast mach jeden 25 in 100 Chance, bei 2 50 in 100 etc. Steht auch im Kleine FAQ Thread drin. PS: Ich wollte eigentlich verhindern das der Thread überquillt... |
||||
11.07.2002, 14:18 | #21 | ||||
Omega Darkblade Beiträge: 257 |
Ok werd hier keine Fragen mehr stellen :) nut noch eines wenn ich das script benutze und dann denjenigen anklicke hört der gar nicht mehr auf zu reden |
||||
11.07.2002, 15:38 | #22 | ||||
Gawain15 Beiträge: 1.084 |
Yo mein Fehler, so wie's jetzt ist sollte es funktionieren. |
||||
13.07.2002, 14:03 | #23 | ||||
Omega Darkblade Beiträge: 257 |
*grml* jetzt isser schon wieder aufer seite 2 gelandet *hochschieb* wann wird der endlich sticky? :D |
||||
15.07.2002, 22:16 | #24 | ||||
criz Beiträge: 39 |
Script: Schwarzpulverfass Das Script in den "OnDamaged Event" eines normalen Fasses (Barrel) kopieren. Fass verwendabr machen, jedoch ohne Gepäck (ist ja schließlich randvoll mit schwarzpulver..) Sobald das Fass einen Schaden bekommt (durch wen oder was auch immer) explodiert dieses in einem grellen Feuerball und beschädigt alle innerhalb eines bestimmten Radius liegenden Objekte, Kreaturen und Spieler. (Anm.: sehr interessant wenn mehrere Fässer nebeneinander stehen :D ) code\: ==> Beim Kopieren des Scripts auf die Zeilenumbrüche achten (besonderst die 2 zeilen die mit TRUE beginnen gehören in die darüberliegende Zeile, sonst -> Fehler! have fun, criz ___________________________ Meine Droge hat einen Namen: RED BULL[/font] |
||||
18.07.2002, 00:21 | #25 | ||||
Gawain15 Beiträge: 1.084 |
So ich habe diesen und den anderen Thread auf den neuesten Stand gebracht. |
||||
|