World of Gothic Archiv > NWN-Hilfe
Profi gesucht, für Scriptkombination: RASTEN
Seite 1 von 1  1 
18.07.2004, 16:38 #1
Micha LNH HSV
Beiträge: 251
Profi gesucht, für Scriptkombination: RASTEN
Ich benötige die Hilfe eines "Scriptgottes" der mir zwei
wundervolle Scripte kombiniert. Einzeln funktionieren
beide mittlerweile einwandfrei, aber ich möchte umbedingt
beide zusammen kombiniert in meinem Modul einsetzen.

1.)
Es wird zum Rasten Nahrung benötigt die dann auch gegessen
wird. Ausserdem wird eine Schlafrolle ausgerollt.
Idee kommt von dem Modul Krynns vergessene Helden.
code\:

#include "alchemy"

void clearAlchemisticVars(object oPC);


void main() {
object oPC = GetLastPCRested();
int iHostileRange = 30;

// set a stack size
object oFood = OBJECT_INVALID;
int i = 1;

// Find first type of food...
while (!GetIsObjectValid(oFood) && (i < 7)) {
oFood = GetItemPossessedBy(oPC, "FOOD_"+IntToString(i));
i++;
}

if (GetIsPC(oPC)) {
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) {
if (GetIsObjectValid(oFood)) {
// found some food, remove it and rest...
// get nearest creature check proximity hostility etc.
object oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY);
if (iHostileRange == 0 || (iHostileRange != 0 && GetDistanceToObject(oCreature) <= IntToFloat(iHostileRange))) {
// make bed...
object oRestbedroll = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_bedrolls", GetLocation(oPC), FALSE);
SetLocalObject(oPC, "oBedrollPlayer", oRestbedroll);
DestroyObject(oFood);
clearAlchemisticVars(oPC);
} else {
AssignCommand (oPC, ClearAllActions());
FloatingTextStringOnCreature ("Es sind Feinde in der Nähe!", oPC);
}
} else {
// no food, no rest
AssignCommand (oPC, ClearAllActions());
FloatingTextStringOnCreature ("Du brauchst Verpflegung um zu rasten!", oPC);
}
}
}

// resting finished or cancelled
if ((GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED ||
GetLastRestEventType() == REST_EVENTTYPE_REST_CANCELLED ||
GetLastRestEventType() == REST_EVENTTYPE_REST_INVALID) &&
GetIsObjectValid(GetLocalObject (oPC, "oBedrollPlayer"))) {
DestroyObject(GetLocalObject (oPC, "oBedrollPlayer"), 0.0f);
DeleteLocalObject (oPC, "oBedrollPlayer");
}


}


void clearAlchemisticVars(object oPC) {
int i;
string sPotion;
for (i=1; i<MAX_POTION; i++) {
sPotion = "potion_"+IntToString(i);
int ended = GetLocalInt(oPC, ALCHEMY_POTION_TIME_END_+ sPotion);
if (ended > 0) {
string sName = GetLocalString(oPC, ALCHEMY_POTION_NAME + sPotion);
SendMessageToPC(oPC, "Die Wirkung von '"+sName+"' endet.");
}
DeleteLocalInt(oPC, ALCHEMY_POTION_TIME_END_+ sPotion);
DeleteLocalInt(oPC, ALCHEMY_POTION_TIME_START_+ sPotion);
DeleteLocalInt(oPC, sPotion);
}
}



2.)
Es ist nur ein Rasten in einem "SAFEREST" Bereich
möglich.
code\:

/*
Module: OnRest Event
Only allow the PC to rest if in an unrestricted area or a safe zone of
a restricted area.
*/
//Check if the player is in a rest-restricted area.
int GetIsRestRestricted(object oPC);
//Check if the player is in a closed room inside a safe-rest trigger.
int GetIsRoomSafe(object oPC);
void main()
{
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
{
object oPC = GetLastPCRested();
if (GetIsRestRestricted(oPC) && !GetIsRoomSafe(oPC))
{
AssignCommand(oPC, ClearAllActions());
AssignCommand(GetHenchman(oPC), ClearAllActions());
FloatingTextStringOnCreature("This area is not safe. You should find a secure room to rest in.", oPC);
}
}
}
//If player is in a rest-restricted area (i.e. if the area's tag ends in "_SR",
//then return TRUE; otherwise return FALSE.
int GetIsRestRestricted(object oPC)
{
string sArea = GetTag(GetArea(oPC));
if (GetStringRight(sArea, 3) == "_SR")
return TRUE;
else
return FALSE;
}
//If a player is within a trigger with the tag "X0_SAFEREST", if the trigger
//encompasses at least one door, and if all doors within the trigger are closed,
//then return TRUE; otherwise return FALSE.
int GetIsRoomSafe(object oPC)
{
object oSafeRoom = GetNearestObjectByTag("X0_SAFEREST", oPC);
int bHasDoors = FALSE;
int bPCInRoom = FALSE;
object oInRoom = GetFirstInPersistentObject(oSafeRoom, OBJECT_TYPE_ALL);
while (GetIsObjectValid(oInRoom))
{
if (oInRoom == oPC)
bPCInRoom = TRUE;
else if (GetObjectType(oInRoom) == OBJECT_TYPE_DOOR)
{
if (GetIsOpen(oInRoom))
return FALSE;
else
bHasDoors = TRUE;
}
oInRoom = GetNextInPersistentObject(oSafeRoom, OBJECT_TYPE_ALL);
}
if (bPCInRoom && bHasDoors)
return TRUE;



else
return FALSE;
}





Wie bekomme ich beide Scripte kombiniert, dass
die PC nur mit Nahrung in SAFEREST Punkten rasten
können. Wer kann mir den Code zusammenfügen?
Danke.


___________________________

Schwarz weiß blaue Grüße:MICHA
[/font]
18.07.2004, 23:39 #2
Kardor
Beiträge: 523

mach ich...aber nicht mehr heute ;)
19.07.2004, 08:11 #3
Micha LNH HSV
Beiträge: 251

quote:
Zitat von Kardor
mach ich...aber nicht mehr heute ;)

Wenn Du das hinbekommst, dass alle Punkte funktionieren, kannst
Du Dir sicher sein das es in meinem Modul einen NPC namens
Kardor geben wird.
19.07.2004, 11:24 #4
Kardor
Beiträge: 523

Frage:

Brauchst du auch die ganzen Alchemie-Geschichten aus Krynns Helden da drin oder einfach nur die Abfrage ob der Spieler Essen hat und ihm eins abziehen?

edit: ich bin jetzt ,mal davon ausgegangen, dass du alles brauchst und hab dir die andere Funktion in das Krynns Helden-Skript eingebaut.

here you go : ( und das noch vor dem Mittagessen ;-) )

code\:

#include "alchemy"

void clearAlchemisticVars(object oPC);
//Check if the player is in a rest-restricted area.
int GetIsRestRestricted(object oPC);
//Check if the player is in a closed room inside a safe-rest trigger.
int GetIsRoomSafe(object oPC);


void main() {
object oPC = GetLastPCRested();
int iHostileRange = 30;

// set a stack size
object oFood = OBJECT_INVALID;
int i = 1;

// Find first type of food...
while (!GetIsObjectValid(oFood) && (i < 7)) {
oFood = GetItemPossessedBy(oPC, "FOOD_"+IntToString(i));
i++;
}

if (GetIsPC(oPC)) {
if (GetIsRestRestricted(oPC) && !GetIsRoomSafe(oPC))
{
AssignCommand(oPC, ClearAllActions());
AssignCommand(GetHenchman(oPC), ClearAllActions());
FloatingTextStringOnCreature("This area is not safe. You should find a secure room to rest in.", oPC);
return;
}


if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) {
if (GetIsObjectValid(oFood)) {
// found some food, remove it and rest...
// get nearest creature check proximity hostility etc.
object oCreature = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY);
if (iHostileRange == 0 || (iHostileRange != 0 && GetDistanceToObject(oCreature) <= IntToFloat(iHostileRange))) {
// make bed...
object oRestbedroll = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_bedrolls", GetLocation(oPC), FALSE);
SetLocalObject(oPC, "oBedrollPlayer", oRestbedroll);
DestroyObject(oFood);
clearAlchemisticVars(oPC);
} else {
AssignCommand (oPC, ClearAllActions());
FloatingTextStringOnCreature ("Es sind Feinde in der Nähe!", oPC);
}
} else {
// no food, no rest
AssignCommand (oPC, ClearAllActions());
FloatingTextStringOnCreature ("Du brauchst Verpflegung um zu rasten!", oPC);
}
}
}

// resting finished or cancelled
if ((GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED ||
GetLastRestEventType() == REST_EVENTTYPE_REST_CANCELLED ||
GetLastRestEventType() == REST_EVENTTYPE_REST_INVALID) &&
GetIsObjectValid(GetLocalObject (oPC, "oBedrollPlayer"))) {
DestroyObject(GetLocalObject (oPC, "oBedrollPlayer"), 0.0f);
DeleteLocalObject (oPC, "oBedrollPlayer");
}


}


void clearAlchemisticVars(object oPC) {
int i;
string sPotion;
for (i=1; i<MAX_POTION; i++) {
sPotion = "potion_"+IntToString(i);
int ended = GetLocalInt(oPC, ALCHEMY_POTION_TIME_END_+ sPotion);
if (ended > 0) {
string sName = GetLocalString(oPC, ALCHEMY_POTION_NAME + sPotion);
SendMessageToPC(oPC, "Die Wirkung von '"+sName+"' endet.");
}
DeleteLocalInt(oPC, ALCHEMY_POTION_TIME_END_+ sPotion);
DeleteLocalInt(oPC, ALCHEMY_POTION_TIME_START_+ sPotion);
DeleteLocalInt(oPC, sPotion);
}
}

//If player is in a rest-restricted area (i.e. if the area's tag ends in "_SR",
//then return TRUE; otherwise return FALSE.
int GetIsRestRestricted(object oPC)
{
string sArea = GetTag(GetArea(oPC));
if (GetStringRight(sArea, 3) == "_SR")
return TRUE;
else
return FALSE;
}

//If a player is within a trigger with the tag "X0_SAFEREST", if the trigger
//encompasses at least one door, and if all doors within the trigger are closed,
//then return TRUE; otherwise return FALSE.
int GetIsRoomSafe(object oPC)
{
object oSafeRoom = GetNearestObjectByTag("X0_SAFEREST", oPC);
int bHasDoors = FALSE;
int bPCInRoom = FALSE;
object oInRoom = GetFirstInPersistentObject(oSafeRoom, OBJECT_TYPE_ALL);
while (GetIsObjectValid(oInRoom))
{
if (oInRoom == oPC)
bPCInRoom = TRUE;
else if (GetObjectType(oInRoom) == OBJECT_TYPE_DOOR)
{
if (GetIsOpen(oInRoom))
return FALSE;
else
bHasDoors = TRUE;
}
oInRoom = GetNextInPersistentObject(oSafeRoom, OBJECT_TYPE_ALL);
}
if (bPCInRoom && bHasDoors)
return TRUE;



else
return FALSE;
}
19.07.2004, 12:56 #5
Micha LNH HSV
Beiträge: 251

Bin @work ich werde es heute Abend ausprobieren.
Wenn es alles funzt, denk dran wenn Du mal in Hamburg
bist, Dich zu melden, dann geht ein Bier auf mich.
21.07.2004, 17:21 #6
Micha LNH HSV
Beiträge: 251

Sorry hatte beruflich viel zu tun und bin erst jetzt
wieder zum "Toolsetten" gekommen.

Kurz und knapp: VIELEN DANK, GENAU SO WOLLTE ICH ES HABEN.
FUNKTIONIERT 1A

Bier ist Dir sicher, willst Du in meinem Modul ein
Zwerg, Mensch oder Elf sein?
21.07.2004, 18:53 #7
Kardor
Beiträge: 523

sehr schön! :)

zu Kardor dem PC:

Kardor stammt aus dem DSA Universum und ist bzw. war (*schnüff*) ein Thorwaler.

Falls dir das nichts sagt, Thorwaler sind grosse, wikingerähnliche Menschen, aus dem Norden Aventuriens, genauer, der grossen und mächtigen Stadt Thorwal. Die Thorwaler sind ein Händler- und Seefahrervolk, das sich mit einigen anderen Städten zu einer Art Fantasy-Hanse zusammen geschlossen hat.

Kardor ist 2m 10 gross, hat lange blonde Haare, einen Vollbart und ist nie ohne seine riesige Streitaxt anzutreffen, die er liebevoll "Hackpeter" nennt.
Er ist ein trinkfester Draufgänger, der lieber erst zuschlägt und dann fragt.
Zwar lässt er sich für seine Dienste gerne gut bezahlen, aber wenn jemand in Not ist hilft er auch so, denn von Haus aus ist er eher gutartiger Natur.
Bei einem Feuer im Kamin, einem ordentlichen Premer Rachenbrand oder einem Humpen Met, erzählt er gerne lange und spannende Geschichten, die z.T selbst erlebt, zum Teil aber auch purstes Seemannsgarn sind.
Als Jugendlicher fuhr er als Schiffsjunge auf Thorwalerschiffen mit und mit 18 beschloss er Thorwal zu verlassen um auf Abenteuer auszuziehen, bereits drei Jahre später kannte man seinen Namen im ganzen Land.

Als Kardor 30 war, geschah etwas, was ihn Zwang in die Kirche des Praios (aventurischer Sonnengott, Oberhaupt der 12 aventurischen Haupt-Götter, die Anhänger des Praios lehnen Magie kategorisch als böse ab und waren z.T. auch an Hexen- und Magierverfolgungen beteiligt) einzutreten und in Zukunft als eine Art Paladin durch die Lande zu ziehen.

Im Alter von nur 34 Jahren wurde er bei der grossen Schlacht gegen die Dämonenhorden des Schwarzmagiers Borbarad getötet.


..äh..ja ich hoffe, das reicht als Charakter-Beschreibung :D...naja hab den halt ein paar Jahre gespielt.

Da Kardor ja "eigentlich" tot ist und aus einem anderen Universum stammt, ist es mir egal in welchem Alter du ihn darstellst.
Ich könnte mir auch vorstellen, dass Kardor in einem parallelen Universum nicht getötet wurde und als geachteter Mann alt wurde...dann sähe er inzwischen wahrscheinlich so aus wie der Kerl auf meinem Porträt...und natürlich kannst du ihn an deine Geschichte anpassen.
Aber ich würd mich echt freuen, in deinem NWN Modul auf mein altes AlterEgo zu stossen, das ist definitv besser als in den Credits erwähnt zu werden :D
24.08.2004, 17:33 #8
Micha LNH HSV
Beiträge: 251

Klar kenne ich DSA und Thorwaler!
Kardor ist nun in meinem Modul eingebaut.
Seih gespannt...

P.S.
Kann sein, dass ich Dich demnächst noch mal mit Scriptproblemen
beschäftige, da ich nun endlich weiter "bastel"...
Seite 1 von 1  1