World of Gothic Archiv > NWN-Hilfe
Scriptsammlung
Seite 1 von 3  1  2  3 
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\:

// Scriptname: Black Powder Barrel
// Author: criz (chris@mgco3.com)
// Date: 15. July 2002
// Version: 1.0
// Usage: Apply this script to the OnDamaged Event of an Barrel
// Description: If Barrel is damaged then it will explode and do
// do some damage to surrounding objects.
// CodeHistory: 15. July 2002 -> creation, testing

void main()
{
float fDamageRange = 6.0; // Range of FireDamage
int iMinDamage = 15; // Minimal Firedamage
int iAddDamage = d6(); // Additional (random) Damage
// TotalDamage to an object is
// iMinDamage + iAddDamage

if (GetLocalInt(OBJECT_SELF,"ExplodeOnce")==0)
{
// Do the nice Fire Explosion
SetLocalInt(OBJECT_SELF,"ExplodeOnce",1);
effect eExpl = EffectVisualEffect(VFX_FNF_FIREBALL);
effect eSmoke = EffectVisualEffect(VFX_FNF_SMOKE_PUFF);
effect eBUMP = EffectVisualEffect(VFX_FNF_SCREEN_BUMP);
effect eDamage = EffectDamage(GetCurrentHitPoints(),DAMAGE_TYPE_FIRE);
DelayCommand(0.2,ApplyEffectToObject(DURATION_TYPE_INSTANT,eExpl,OBJECT_SELF));
DelayCommand(0.3,ApplyEffectToObject(DURATION_TYPE_INSTANT,eBUMP,OBJECT_SELF));
DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,eSmoke,OBJECT_SELF));
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,OBJECT_SELF);
}
else
{
// Do Damage to all Objects in a range defined by fDamageRange
object o;
effect eFireDamage;
o = GetFirstObjectInShape(SHAPE_SPHERE,fDamageRange,GetLocation(OBJECT_SELF) ,TRUE,OBJECT_TYPE_ALL);
while(GetIsObjectValid(o))
{
eFireDamage = EffectDamage(iMinDamage + iAddDamage,DAMAGE_TYPE_FIRE, DAMAGE_POWER_PLUS_TWO);
DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_INSTANT,eFireDamage,o));
o = GetNextObjectInShape(SHAPE_SPHERE,fDamageRange,GetLocation(OBJECT_SELF), TRUE,OBJECT_TYPE_ALL);
}

}
}



==> 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.
Seite 1 von 3  1  2  3