World of Gothic Archiv > NWN-Hilfe
Script: MagicDoor
Seite 1 von 1  1 
11.07.2002, 14:03 #1
criz
Beiträge: 39
Script: MagicDoor
hallo,
hab schon öfters dieses forum als "reiner" Leser besucht und nun endlich es geschafft mich zu registrieren :)

Und gleich zu Beginn ein kleines Script zur Erstellung einer magischen Türe. Einfach einmal ausprobiern, also IMHO find ichs cool.

MagicDoor:
------------------
Version: beta (0.0001)
Author: criz

Script einfach in OnHeartBeat einer Tür stellen. In der main() kann man zusätzlich noch ein paar Werte ändern. Einfach ausprobieren und sollte es noch fragen geben -> posten...

code\:

int GetExistItemInInventory(object oTarget, string sItemTag)
{
object oItem;
oItem = GetFirstItemInInventory(oTarget);
for( ; ; )
{
if (oItem == OBJECT_INVALID)
{
break;
}
else
{
if (GetTag(oItem)==sItemTag) return TRUE;
}
oItem = GetNextItemInInventory(oTarget);
}
return FALSE;
}
void ApplyVisualEffectsToMagicDoor(int MagicDoorType)
{
// apply visual effect to door (depends on MAGIC_DOOR_TYPE)
effect e1,e2;
if ((MagicDoorType<0)||(MagicDoorType>2)) MagicDoorType=0;
switch(MagicDoorType)
{
case 0:
e1 = EffectVisualEffect(VFX_DUR_AURA_SILENCE);
e2 = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_5);
break;
case 1:
e1 = EffectVisualEffect(VFX_DUR_AURA_COLD);
e2 = EffectVisualEffect(VFX_DUR_LIGHT_BLUE_5);
break;
case 2:
e1 = EffectVisualEffect(VFX_DUR_AURA_FIRE);
e2 = EffectVisualEffect(VFX_DUR_LIGHT_RED_5);
break;
}
ApplyEffectToObject(DURATION_TYPE_PERMANENT,e1,OBJECT_SELF,1.0);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,e2,OBJECT_SELF,1.0);
}

void ActionMagicDoor(float MaxDistance,int MagicDoorType,string ItemTag)
{

// get distance to player
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC);
float distance = GetDistanceToObject(oPC);
if (distance < MaxDistance )
{
// -> player is in near enaugh
if ((GetExistItemInInventory(oPC,ItemTag)==TRUE)||(MagicDoorType==0))
{
// -> player can pass
if (GetIsOpen(OBJECT_SELF)==FALSE)
{
ActionPlayAnimation(ANIMATION_PLACEABLE_OPEN);
ActionOpenDoor(OBJECT_SELF);
}
}
else
{
// -> player can not pass
if (MagicDoorType==2)
{
//-> do bad things to player (one time)
int iDidDamage = GetLocalInt(OBJECT_SELF,"DidDamage");
if (iDidDamage == 0)
{
AssignCommand(oPC,ActionCastSpellAtObject(SPELL_SOUND_BURST, oPC,METAMAGIC_MAXIMIZE,TRUE,FEAT_FIRE_DOMAIN_POWER,PROJECTILE_PATH_TYPE_ DEFAULT,TRUE));
// 25% damage
int dm = GetMaxHitPoints(oPC) / 4;
effect md = EffectDamage(dm,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_NORMAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT,md,oPC,1.0);
iDidDamage = 1;
SetLocalInt(OBJECT_SELF,"DidDamage",iDidDamage);
}

}
}
}
else
{
// -> player is to far away
if (GetIsOpen(OBJECT_SELF)==TRUE)
{
ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE);
ActionCloseDoor(OBJECT_SELF);
}
SetLocalInt(OBJECT_SELF,"DidDamage",0);
}
}
void main()
{
// Settings:
float MAX_DISTANCE = 4.0; // max. distance to doo
int MAGIC_DOOR_TYPE = 2 ; // 0 ... simple magic door (no item required)
// 1 ... normal magic door (item required)
// 2 ... evil magic door (item required, if no item found -> spell cast on player)
string ITEM_TAG = "DazursWegbereiter"; // ItemTag of Item to open the door

ApplyVisualEffectsToMagicDoor(MAGIC_DOOR_TYPE);

ActionMagicDoor(MAX_DISTANCE,MAGIC_DOOR_TYPE,ITEM_TAG);

DelayCommand(2.0,ActionMagicDoor(MAX_DISTANCE,MAGIC_DOOR_TYPE,ITEM_TAG));
DelayCommand(4.0,ActionMagicDoor(MAX_DISTANCE,MAGIC_DOOR_TYPE,ITEM_TAG));
}




>> criz


___________________________

Meine Droge hat einen Namen:
RED BULL[/font]
11.07.2002, 14:06 #2
Gawain15
Beiträge: 1.084

Scriptesammlung-Eigentlich-Sticky-Thread :)
11.07.2002, 14:10 #3
criz
Beiträge: 39

frage?

wie bekomme ich dieses verdammte (:) ) ding aus meinem code raus?

(es sollte ein for( ; ; ) dort zu finden sein)

criz
11.07.2002, 14:13 #4
Lzoril
Beiträge: 45

Mach ein Häckchen vor "Smilies in diesem Beitrag deaktivieren" unter dem Eingabefenster der Nachricht
11.07.2002, 14:18 #5
criz
Beiträge: 39

thx, aber ein Leerzeichen zwischen ; und ) hats auch getan...

criz
11.07.2002, 14:18 #6
LightHawk
Beiträge: 100

"Smilies in diesem Beitrag deaktivieren" bei Optionen anlicken.

Darf ich das Script in das Forgotten Book überhemen ?
11.07.2002, 14:22 #7
criz
Beiträge: 39

natürlich!

Mich würde auch eure Meinung zum Script interessieren...
schon wer ausprobiert?

criz
11.07.2002, 14:32 #8
Omega Darkblade
Beiträge: 257

Was macht diese Tür genau?
11.07.2002, 14:49 #9
criz
Beiträge: 39

Von dieser Tür gibt es 3 Typen (kann man in der main() einstellen)

Typ 0: Einfache magische Tür
-----------------------------

Sobald der Spieler innerhalb eines 4m Radius um die Türe befindet öffnet sich diese automatisch. Sobald der Spieler außerhalb ist, schließt sie sich wieder.

Den 4m Radius kann man auch in der main() ändern, sollte aber dabei belassen werden, da der visuelle Effekt (Aura) genau einen Radius von 4m besitzt. (Alles andere glaub ich würde den Spieler verwirren.)

Typ 1: Normal magische Tür
---------------------------

So wie Typ 0, nur das man einen bestimmten Gegenstand (ItemTag kann in main() gesetzt werden) im Gepäck mitführen muss damit sich die Türe öffnet.

Typ 2: Bösartige magische Tür
-----------------------------
So wie Typ 1, jedoch mit dem Unterschiede, dass wenn der Spieler den Gegenstand nicht im Gepäck hat diesem einen schaden von 25% seiner Maximalen HitPoints zugefügt wird. :D

Anmerkung:

Eine magische Tür macht nur dann sinn wenn diese Türe verschlossen ist und weder zerstörbar (Handlung) oder durch Diebeskunst geöffnet werden kann...


criz
11.07.2002, 15:23 #10
Omega Darkblade
Beiträge: 257

Hey das Script gefällt mir :)
Ma gucken ob ich das wo unterbringen kann
13.07.2002, 13:28 #11
Tillian
Beiträge: 7

hm...ich bekomme immer eine fehlermeldung in reihe 71, das etwas nicht komplimiert werden kann. kommt aber wohl daher, dass ich einfach keine ahnung habe...:)

also ich habe alles aus dem zitat kopiert dann meine tür geschaffen , bin auf script gegangen, hab ebei "OnHeartBeat" mein <magischetür> eingetippt und auf bearbeiten geklickt. dann kam "bing" nues schript wird erstelklt und ich habe die ersten 4 zeilen gelöscht, die schon automatisch da waren und alles gepastet. habe dann donarixxx für meinen haustür schlüssel getauscht und sonst alles gelassen , da es mir schien als ob es schon auf böse tür eingestellt sei. drück auf speichern und bei reihe 71 kommt der fehler...

was habe ich falsch gemacht?
hoffe es ist jemand inder lage mir das irgendwie noobhaft zu erklären, hab von scripten leider keine ahnung....
13.07.2002, 14:25 #12
Omega Darkblade
Beiträge: 257

ICh hab da auch 0 ahnung von :)

also Zeile 71 is

DEFAULT,TRUE));

das einzige was man da ändern kann is von TRUE auf FALSE stellen, aber ka was das bringt
13.07.2002, 14:31 #13
Tillian
Beiträge: 7

:) habe auch 0 plan. habe das 1:1 übernommen aus dem zitat...nur das sagt er immer fehler und zeigt die zeile an...
13.07.2002, 14:36 #14
Omega Darkblade
Beiträge: 257

Hat überhaupt schon ma wer das script getestet?
villeicht hat das ja auch irgentwo nen fehler
13.07.2002, 14:46 #15
Tillian
Beiträge: 7

also die idee ist schon genial. genau eine solche tür könnt ich gebrauchen!!
14.07.2002, 21:20 #16
criz
Beiträge: 39

sry, werd mir das gleich ansehen...
auf alle fälle bei mir funkts...

criz
14.07.2002, 22:37 #17
Gorillababy
Beiträge: 7

ich habs selbst nich ausprobiert, aber es kann sein dass der zeilensprung ausm forum mitkopiert wird. in dem falle vor DEFAULT einfach einmal backspace drücken und schon funktionierts :)
14.07.2002, 23:49 #18
Tillian
Beiträge: 7

ich habe die zeile 70 oder 71, weiss nciht mehr so genau gelöscht(da wo der fehler diesmal angezeigt wurde und jetzt gehts. ich sehe auch diese blauen und roten kreisauren...habe die aber gegen den zauber "unheimliches scheusal" umgetauscht... :D
15.07.2002, 09:12 #19
Paleswift
Beiträge: 154
Re: Script: MagicDoor
Hi.. scheint ein nettes Script.. aber ich häte noh ein paar Vorschläge zur Optimierung:


Erstens diese Funktion könnte man auch so schreiben.. etwas kürzer und performanter:
code\:

int GetExistItemInInventory(object oTarget, string sItemTag)
{
object oItem = GetObjectByTag(sItemTag);
if(GetIsObjectValid(oItem))
{
object oPosessor = GetItemPossessor(oItem);
if(GetIsObjectValid(oPosessor) && (oPosessor == oTarget))
return true;
else return false;
}



der Rest ist ganz oki..
Congratulations ! Good work ;)


___________________________

c===|[:::::::::::::::::>
Ja! ich bin unfähg die Rechtschreibung zu beachteln.. und das isd auch dut so![/font]
15.07.2002, 09:44 #20
criz
Beiträge: 39

thx, werde ich doch glatt umbauen.

Werde dieses Script noch etwas besser dokumentieren (erklären) und optimieren, damit eine schöne Version davon ins Forgotten Book kommt.

criz
Seite 1 von 1  1