Jump to content

My NPC spawns twice


ericp07

Recommended Posts

Hello,

 

Now that I've got my NPC--complete with correctly assigned custom kit!--to successfully install, I've encountered another unwanted behavior: she spawns, approaches the party, and talks. Then a second copy of her spawns (in the spot where the first one spawned), approaches the party, and talks.

 

I have placeholder text where her actual dialogue lines should be, as someone suggested I APPEND certain structures (with placeholder text) to all my .d files, so I'll change her lines to the way they should display, and check the joining script. What is unclear to me is why she spawns twice.

 

If I force her into the party (ctrl-Q), she'll join and level up, as she should, and then she behaves as she should.

 

What files/coding do we need to examine to solve this one?

 

Thanks,

Eric

Link to comment

Hm, I would look at the spawning script, and her dialogue, especially the variables that get set. Maybe the spawning variable gets unset instead of increased or something (that would be the trivial solution, although rather unlikely, alas.)

Link to comment
What files/coding do we need to examine to solve this one?
If you have followed this, the J-dialog, and the joining area script.

 

Hm, I would look at the spawning script, and her dialogue, especially the variables that get set. Maybe the spawning variable gets unset instead of increased or something (that would be the trivial solution, although rather unlikely, alas.)
Not so much, if one puts the summoning script to use IF !(variable=1) THEN summon END
Link to comment

My AR1200.baf looks like:

 

// Hinaeariel's spawning script
IF
Global("HinExists","AR1200",0)
THEN
RESPONSE #100
CreateCreature("EP#Hin",[2100.1750],7)
SetGlobal("HinExists","AR1200",1)
Continue()
END

 

The J.d file is in the process of being rewritten, as someone suggested I retructure it this way, but now I'm unsure exactly where to put the text for each of the dialogues. EP#HinJ.d, then, looks like:

 

/* BEGIN:  initiate file all SoA mod dialogue files */

BEGIN ~EP#Hin~
BEGIN ~EP#HinJ~
BEGIN ~EP#HinB~
BEGIN ~EP#HinP~

/*  END:  initiate file all SoA mod dialogue files */

/* BEGIN: all I_C_T's for SoA */

I_C_T NALIA 45 EP#HinCommentNaliaJoin
== ~EP#HinJ~ IF ~InParty("Nalia") InMyArea("Nalia")~ THEN ~I have never seen anyone look so fancy! Even with your adventuring gear, you look so...formal.~
END

/* END: all I_C_T's for SoA */

/* BEGIN: things that get added to H's Joined dialog file */

APPEND ~EP#HinJ~

IF ~IsGabber(Player1)~ THEN PID1
 SAY ~(Hinaeariel notices you looking at her strangely.)~
 = ~Mani naa ta? What is it, <CHARNAME>?~
 ++ ~Just wondering how you're doing.~ + PID1-1
 ++ ~You’re good company, Hinaeariel!~ + PID1-2
 ++ ~I was noticing the necklace you wear. Would you mind telling me about it?~ + PID-3
END

IF ~~ PID1-1
 SAY ~I’m well. Thank you for asking!~
 IF ~~ THEN EXIT
END

IF ~~ PID1-2
 SAY ~Diolalle! Thank you, <CHARNAME>!~
 IF ~~ THEN EXIT
END

IF ~~  PID-3
 SAY ~This is the symbol of the Supreme Ranger and Lady of the Forest, Mielikki. I received it when Needles made me one of them. I treasure it...and I never remove it.~
 ++ ~PC Placeholder: Response one~ EXIT
 ++ ~PC Placeholder: Response two~ EXIT
 ++ ~PC Placeholder: Response three~ EXIT
END

/* these blocks are called from PLAYER1.DLG */

IF ~~ Option1
 SAY ~<CHARNAME>, I’m in!~
 COPY_TRANS PLAYER1 33
END

IF ~~ Option2
 SAY ~No time to be sentimental now. Let’s get this over with!~
 COPY_TRANS PLAYER1 33
END

IF ~~ Option3
 SAY ~Let’s go!!!~
 COPY_TRANS PLAYER1 33
END

END /* of append to EP#HinJ */

/* END: things that get added to H's Joined dialog file */

/* BEGIN: things that get added to PLAYER1 dialog file */

/* SoA: Tree of Life Extension, Part A */
/* Add the extension to the bottom of the stack */
EXTEND_BOTTOM ~PLAYER1~ 33
 IF ~InParty("EP#Hin") InMyArea("EP#Hin") !StateCheck("EP#Hin",CD_STATE_NOTVALID) Global("EP#Hintreelife","LOCALS",0)~ EXTERN ~PLAYER1~ EP#HinTreeOfLifeTalk
END

/* SoA: Tree of Life Extension, Part B : Add the initiating state */
APPEND ~PLAYER1~

IF ~~ EP#HinTreeOfLifeTalk
 SAY ~Hinaeariel: the Elven ranger who has been at your side through much adventure~
 ++ ~Hinaeariel, You don’t have to do this, you know. You don’t have to risk your life for mine.~ DO ~SetGlobal("EP#Hintreelife","LOCALS",1)~ EXTERN EP#HinJ Option1
 ++ ~Hinaeariel, you’re a good friend, and I don’t want you harmed. You would be wise to go.~ DO ~SetGlobal("EP#Hintreelife","LOCALS",1)~ EXTERN EP#HinJ Option2
 ++ ~Hinaeariel, are you ready for this?~ DO ~SetGlobal("EP#Hintreelife","LOCALS",1)~ EXTERN EP#HinJ Option3
END

END /* of append to PLAYER1*/

/* END: things that get added to PLAYER1 dialog file */


/* BEGIN: things that get added to H's SoA pre-joined dialog file */

APPEND ~EP#Hin~

IF ~NumTimesTalkedTo(0)~ THEN BEGIN first_met_party
 SAY ~Heya. This is a placeholder state.~
 ++ ~placeholder option 1~ + pre_join_1
 ++ ~placeholder option 2~ + pre_join_2
END

IF ~~ pre_join_1
 SAY ~Heya. This is a placeholder state. Option 1.~
 IF ~~ THEN EXIT
END

IF ~~ pre_join_2
 SAY ~Heya. This is a placeholder state. Option 2.~
 IF ~~ THEN EXIT
END

END /* of APPEND to EP#Hin */

/* END: things that get added to H's SoA pre-joined dialog file */

/* BEGIN: things that get added to H's SoA left dialog file */

APPEND ~EP#HinP~

IF ~IsGabber(Player1)~ THEN BEGIN left_party
 SAY ~Heya. This is a placeholder state. I want to know if you want me in the party or not, sine you just kicked me out.~
 ++ ~I want you in the party, H.~ + left_party_1
 ++ ~Actually, I follow Malarite ways. Run quickly - I enjoy the thrill of the hunt.~ + left_party_2
END

IF ~~ left_party_1
 SAY ~Heya. This is a placeholder state. Option 1.~
 IF ~~ THEN DO ~JoinParty()~ EXIT
END

IF ~~ left_party_2
 SAY ~Heya. This is a placeholder state. Option 2.~
 IF ~~ THEN DO ~LeaveParty() EscapeArea()~ EXIT
END

END /* of append EP#HinP */

/* END: things that get added to H's SoA left-party dialog file */

/* BEGIN: all SoA Banter CHAINs from all dialogs */

/* END: all SoA Banter CHAINs from all dialogs */

/* BEGIN: all SoA CHAIN materials from all dialogs */

/* END: all SoA CHAIN materials from all dialogs */

 

I'm tempted to just forget the way it's written now, and redo it the way the tutorial shows how, but I'm curious about what, if any, the advantages are of having it this way.

 

In any case, I hope this sheds some light on why the NPC spawns twice. I've had to reinstall the mod several times, as I make changes to correct things.

 

Thanks,

Eric

Link to comment
Take Continue() out of the script. Its not a good idea to use that when spawning in creatures.

 

OK, I've commented that out, for the time being. If things work properly on reinstall and retest, then I'll delete the line.

 

Thanks,

Eric

Link to comment

Only one spawning of the NPC now. All I have to do is fix the J.d file, so she'll join the party (nothing happens if I choose either of the two options shown, and then, she has nothing to say to charname if he tries to talk to her again).

 

Thanks,

Eric

Link to comment
(nothing happens if I choose either of the two options shown, and then, she has nothing to say to charname if he tries to talk to her again).
Well, yeah, as the code is:
APPEND ~EP#Hin~

IF ~NumTimesTalkedTo(0)~ THEN BEGIN first_met_party
 SAY ~Heya. This is a placeholder state.~
 ++ ~placeholder option 1~ + pre_join_1
 ++ ~placeholder option 2~ + pre_join_2
END

IF ~~ pre_join_1
 SAY ~Heya. This is a placeholder state. Option 1.~
 IF ~~ THEN EXIT
END

IF ~~ pre_join_2
 SAY ~Heya. This is a placeholder state. Option 2.~
 IF ~~ THEN EXIT
END

You need this:

IF ~~ THEN REPLY ~PCs reply~ DO ~SetGlobal("HinaearielJoined","LOCALS",1) JoinParty()~ EXIT

instead of:

IF ~~ THEN EXIT

Or some such... Of course most modders actually use the EP#HinJ dialog to make the character join and the plane EP#Hin for the normal talks, and the EP#HinP for the Post leaving group talks... but whatever.

Link to comment

The problem with taking the Continue() out of there is that using EXTEND_TOP, you block everyone else's actions later on -

 

you could change that to EXTEND_BOTTOM, but then you can have some other modder do E_T and your NPC doesn't spawn.

 

Chicken and Egg question, I believe!

 

 

looking at the ar

Older materials use EXTEND_BOTTOM and avoid using OnCreation(), since that is completely blocked when something is set above it (the script rns through, and starts at the top again when something becomes true, at which point the OnCreation() fails because the script has already been checked once, I believe).

 

Newer stuff relies on EXTEND_TOP and Continue().

 

Take a look at Gavin's spawning, to check how B does it so it doesn't loop - it may be that the solution is to "cheat", creating your NPC in an area where you can E_T and Continue() and then have it moved to the place you want the NPC to be met.

 

Look for an area script that has things to evaluate - if there is next to nothing in the area script, you get that loop due to the continue.

 

looking at vanilla ar1200,

 

IF
 OnCreation()
 Global("CloseTempleRuin","AR1200",0)
THEN
 RESPONSE #100
SetGlobal("CloseTempleRuin","AR1200",1)
TriggerActivation("TRAN1201",FALSE)
END

IF
 Global("AewimerEscape","AR1200",1)
 Global("TheMerchantsLeave","AR1200",0)
THEN
 RESPONSE #100
SetGlobal("TheMerchantsLeave","AR1200",1)
ActionOverride("aewimer1",EscapeArea())
ActionOverride("aewimer2",EscapeArea())
ActionOverride("aewimer3",EscapeArea())
END

IF
 Dead("palkni01")  // ~Ogre Mage~
 Dead("palkni02")  // ~Ogre~
 Dead("palkni03")  // ~Gnoll Elite~
 Dead("palkni04")  // ~Ogre~
 Dead("palkni05")  // ~Baby Wyvern~
 Global("DomainPaladinBattle","GLOBAL",0)
THEN
 RESPONSE #100
SetGlobal("DomainPaladinBattle","GLOBAL",1)
CreateCreatureOffScreen("garren",0)  // ~Garren Windspear~
TriggerActivation("TRAN1201",TRUE)
TriggerActivation("TEMPLE1",FALSE)
ActionOverride("palkni01",DestroySelf())
ActionOverride("palkni02",DestroySelf())
ActionOverride("palkni03",DestroySelf())
ActionOverride("palkni04",DestroySelf())
ActionOverride("palkni05",DestroySelf())
CreateCreatureAtLocation("LOCpalkni01","GLOBAL","deadb01")
CreateCreatureAtLocation("LOCpalkni02","GLOBAL","deadb01")
CreateCreatureAtLocation("LOCpalkni03","GLOBAL","deadb01")
CreateCreatureAtLocation("LOCpalkni04","GLOBAL","deadb01")
CreateCreatureAtLocation("LOCpalkni05","GLOBAL","deadb01")
END

IF
 Global("StartKidnap","AR1200",0)
 OR(2)
Global("Kidnap","GLOBAL",1)
Global("Kidnap","GLOBAL",2)
THEN
 RESPONSE #100
SetGlobal("StartKidnap","AR1200",1)
END

IF
 Global("frLeaveDryads","AR1200",1)
THEN
 RESPONSE #100
ActionOverride("Ulene",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Cania",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Elyme",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Llylla",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Ulene",EscapeArea())
ActionOverride("Cania",EscapeArea())
ActionOverride("Elyme",EscapeArea())
ActionOverride("Llylla",EscapeArea())
END

IF
 Global("VaelasaHostile","GLOBAL",1)
THEN
 RESPONSE #100
SetGlobal("VaelasaHostile","GLOBAL",2)
CreateCreature("vbearbl",[4265.3351],4)  // ~Black Bear~
CreateCreature("vbearca",[4209.3210],2)  // ~Cave Bear~
CreateCreature("vbearbr",[3712.3343],10)  // ~Brown Bear~
CreateCreature("ankheg01",[3704.3306],0)  // ~Ankheg~
CreateVisualEffect("SPWOOD",[4041.3199])
CreateVisualEffect("SPWOOD",[3776.3177])
Wait(4)
CreateCreature("SIRINE01",[4041.3199],14)  // ~Sirine~
CreateCreature("SIRINE01",[3776.3177],14)  // ~Sirine~
END

IF
 Global("FirbanFight","GLOBAL",1)
 Global("JumOutside","AR1200",0)
 !Dead("garjum")  // ~Jum~
THEN
 RESPONSE #100
SetGlobal("JumOutside","AR1200",1)
CreateCreature("garjum",[1072.3432],6)  // ~Jum~
ActionOverride("garjum",SetNumTimesTalkedTo(1))
END

 

 

removing that Continue(0 and using E_T will assuredly screw up the game: the first block will never run.

 

You could check with Ajantis' code, too, since Jastey had to mess around with this area for that mod ???

 

(or just move it to EXTEND_BOTTOM, forget the Continue(), and then if someone is silly enough to add an "always true" trigger in an EXTEND_TOP aove yours, you get the fun of troubleshooting someone else's mistakes :hm: )

Link to comment
Of course most modders actually use the EP#HinJ dialog to make the character join and the plane EP#Hin for the normal talks,

 

(other way around, Jarno - you must have typoed!

 

MYNPC = pre joined, has the Join() stuff

MYNPCJ = already joined up, has most stuf initiated with StartDialog() and its variants

MYNPCB = already in the party, all the banter stuff set up using Interact() and its related variants

MYNPCP = pot file, kicked out of party - has both JoinParty() and LeaveParty() stuff

Link to comment
Of course most modders actually use the EP#HinJ dialog to make the character join and the plane EP#Hin for the normal talks,

 

(other way around, Jarno - you must have typoed!

 

MYNPC = pre joined, has the Join() stuff

MYNPCJ = already joined up, has most stuf initiated with StartDialog() and its variants

MYNPCB = already in the party, all the banter stuff set up using Interact() and its related variants

MYNPCP = pot file, kicked out of party - has both JoinParty() and LeaveParty() stuff

 

This is my understanding of things, and how I want everyting sorted. My B file will also include friendship and romance talks...at least, that's the plan.

 

The file with all the placeholder text was called testing.d, and I've already forgotten the proper intent of its use (but can refer back to earlier posts here). Probably my best bet is to keep it separate, outside my mod folder, and restore all my .d files to the way they were before.

 

Thanks,

Eric

Link to comment
The problem with taking the Continue() out of there is that using EXTEND_TOP, you block everyone else's actions later on -

 

you could change that to EXTEND_BOTTOM, but then you can have some other modder do E_T and your NPC doesn't spawn.

 

Chicken and Egg question, I believe!

 

 

looking at the ar

Older materials use EXTEND_BOTTOM and avoid using OnCreation(), since that is completely blocked when something is set above it (the script rns through, and starts at the top again when something becomes true, at which point the OnCreation() fails because the script has already been checked once, I believe).

 

Newer stuff relies on EXTEND_TOP and Continue().

 

Take a look at Gavin's spawning, to check how B does it so it doesn't loop - it may be that the solution is to "cheat", creating your NPC in an area where you can E_T and Continue() and then have it moved to the place you want the NPC to be met.

 

Look for an area script that has things to evaluate - if there is next to nothing in the area script, you get that loop due to the continue.

 

looking at vanilla ar1200,

 

IF
 OnCreation()
 Global("CloseTempleRuin","AR1200",0)
THEN
 RESPONSE #100
SetGlobal("CloseTempleRuin","AR1200",1)
TriggerActivation("TRAN1201",FALSE)
END

IF
 Global("AewimerEscape","AR1200",1)
 Global("TheMerchantsLeave","AR1200",0)
THEN
 RESPONSE #100
SetGlobal("TheMerchantsLeave","AR1200",1)
ActionOverride("aewimer1",EscapeArea())
ActionOverride("aewimer2",EscapeArea())
ActionOverride("aewimer3",EscapeArea())
END

IF
 Dead("palkni01")  // ~Ogre Mage~
 Dead("palkni02")  // ~Ogre~
 Dead("palkni03")  // ~Gnoll Elite~
 Dead("palkni04")  // ~Ogre~
 Dead("palkni05")  // ~Baby Wyvern~
 Global("DomainPaladinBattle","GLOBAL",0)
THEN
 RESPONSE #100
SetGlobal("DomainPaladinBattle","GLOBAL",1)
CreateCreatureOffScreen("garren",0)  // ~Garren Windspear~
TriggerActivation("TRAN1201",TRUE)
TriggerActivation("TEMPLE1",FALSE)
ActionOverride("palkni01",DestroySelf())
ActionOverride("palkni02",DestroySelf())
ActionOverride("palkni03",DestroySelf())
ActionOverride("palkni04",DestroySelf())
ActionOverride("palkni05",DestroySelf())
CreateCreatureAtLocation("LOCpalkni01","GLOBAL","deadb01")
CreateCreatureAtLocation("LOCpalkni02","GLOBAL","deadb01")
CreateCreatureAtLocation("LOCpalkni03","GLOBAL","deadb01")
CreateCreatureAtLocation("LOCpalkni04","GLOBAL","deadb01")
CreateCreatureAtLocation("LOCpalkni05","GLOBAL","deadb01")
END

IF
 Global("StartKidnap","AR1200",0)
 OR(2)
Global("Kidnap","GLOBAL",1)
Global("Kidnap","GLOBAL",2)
THEN
 RESPONSE #100
SetGlobal("StartKidnap","AR1200",1)
END

IF
 Global("frLeaveDryads","AR1200",1)
THEN
 RESPONSE #100
ActionOverride("Ulene",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Cania",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Elyme",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Llylla",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Ulene",EscapeArea())
ActionOverride("Cania",EscapeArea())
ActionOverride("Elyme",EscapeArea())
ActionOverride("Llylla",EscapeArea())
END

IF
 Global("VaelasaHostile","GLOBAL",1)
THEN
 RESPONSE #100
SetGlobal("VaelasaHostile","GLOBAL",2)
CreateCreature("vbearbl",[4265.3351],4)  // ~Black Bear~
CreateCreature("vbearca",[4209.3210],2)  // ~Cave Bear~
CreateCreature("vbearbr",[3712.3343],10)  // ~Brown Bear~
CreateCreature("ankheg01",[3704.3306],0)  // ~Ankheg~
CreateVisualEffect("SPWOOD",[4041.3199])
CreateVisualEffect("SPWOOD",[3776.3177])
Wait(4)
CreateCreature("SIRINE01",[4041.3199],14)  // ~Sirine~
CreateCreature("SIRINE01",[3776.3177],14)  // ~Sirine~
END

IF
 Global("FirbanFight","GLOBAL",1)
 Global("JumOutside","AR1200",0)
 !Dead("garjum")  // ~Jum~
THEN
 RESPONSE #100
SetGlobal("JumOutside","AR1200",1)
CreateCreature("garjum",[1072.3432],6)  // ~Jum~
ActionOverride("garjum",SetNumTimesTalkedTo(1))
END

 

 

removing that Continue(0 and using E_T will assuredly screw up the game: the first block will never run.

 

You could check with Ajantis' code, too, since Jastey had to mess around with this area for that mod ???

 

(or just move it to EXTEND_BOTTOM, forget the Continue(), and then if someone is silly enough to add an "always true" trigger in an EXTEND_TOP aove yours, you get the fun of troubleshooting someone else's mistakes :hm: )

 

OK, then. Even though the scripts appear to work, I don't want to risk things getting screwed up later (especially after I install a ton of other mods). I'll use the EXTEND_BOTTOM approach for AR1200.bcs in my .tp2, and eliminate Continue() in my .baf.

 

Thanks,

Eric

Link to comment
The problem with taking the Continue() out of there is that using EXTEND_TOP, you block everyone else's actions later on -
NO, to my understanding, the problem lies here, in your code, not in ericp07's:

IF
 OnCreation()
 Global("CloseTempleRuin","AR1200",0)
THEN
 RESPONSE #100
SetGlobal("CloseTempleRuin","AR1200",1)
TriggerActivation("TRAN1201",FALSE)
END

As this might need to have a Continue() ... because you just used the OnCreation() in front of it... but if you don't use that, but have the script running second by second again and again, and have the blocks IF's come true one by one, so the first ones action is ran and then the script is then again ran from the beginning and so the already used scripts IF is not true anymore, because the SetGlobal(...) was used to make the Global(...) not true anymore.

Of course the case where the SetGlobal(...) is not used might need a Continue()... but let's not try to spam the map full of goblins, shall we.

 

Rats, well, this is guaranteed to need a Continue() :

IF
 Global("frLeaveDryads","AR1200",1)
THEN
 RESPONSE #100
ActionOverride("Ulene",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Cania",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Elyme",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Llylla",MoveToPointNoInterrupt([5099.3283]))
ActionOverride("Ulene",EscapeArea())
ActionOverride("Cania",EscapeArea())
ActionOverride("Elyme",EscapeArea())
ActionOverride("Llylla",EscapeArea())
END

Whatever...

Link to comment

All that material I posted was vanilla stuff already in game, Jarno - I think you are looking at the things as a modder, where we add to the original files. Unless i am not understanding you?

 

The original scrip decompiled from a clean vanilla non-fixpacked absolutely clean installation starts with a BioWare "standard usage" block:

 

IF
 OnCreation()
 Global("CloseTempleRuin","AR1200",0)
THEN
 RESPONSE #100
SetGlobal("CloseTempleRuin","AR1200",1)
TriggerActivation("TRAN1201",FALSE)
END

 

Because they did that, we can't have things above it that block it - a pet peeve of BWP folks when modders use EXTEND_TOP and set up something that blocks it.

 

I think there is a thread or two around that does the full explination.. hold on...

 

 

What Continue() does, devSin's answer:

http://forums.pocketplane.net/index.php/to....html#msg303556

 

* * * > Why you want to look at your resources, and then recheck other folks, and then make the choice (a veritable who's whom of knowledgeable moddarz weighing in on E_T vs E_B and Continue() and OnCreation() ):

http://forums.pocketplane.net/index.php/topic,24976.0.html

 

 

SHS discussion on the same issue, with King Diamond and the Old Guard moddarz:

 

http://www.shsforums.net/topic/21360-continues/

 

Basic rule of thumb from above discussions:

 

I have a mod that adds to an area script. The best way to insure I don't mess something up is to EXTEND_BOTTOM. If for some reason I need to EXTEND_TOP, the safest way to insure that I don't mess up someone else's work is to add Continue() to every block which goes into that E_T if the area script has an OnCreation() block, or if any mod with which compatibility is desired adds an OnCreation() block to that area script.

 

 

It doesn't stop some idiot misguided person from screwing up your mod by doing

 

IF

True()

THEN RESPONSE #100

do something

END

 

and using EXTEND_TOP - but it does make sure that you have done everything in your power to make things work woth other folks.

Link to comment

OK, so you are right... in a way.

 

But just for fun... and because I cannot get into the pocketplane.net because the bandwith exceeded issue...

The best way to insure I don't mess something up is to EXTEND_BOTTOM.
Erhm, why? Because you might mess up your mods test because you messed up the script, after all you are trying to test it, when you try to test it... of course you should then change the unneeded EXTEND_TOP's to EXTEND_BOTTOM's...

 

The best way to insure... If for some reason I need to EXTEND_TOP, the safest way to insure that I don't mess up someone else's work is to add Continue() to every block which goes into that E_T if the area script has an OnCreation() block, or if any mod with which compatibility is desired adds an OnCreation() block to that area script.
Erhm, the best way to insure that the script actually works is to block the IF ~...~ with a Global() check if you can, and if you cannot, use the Continue() when needed, to make it a closed circle, unless you wish to do something very specific, which you'll be debugging the rest of your unnatural existance. The EXTEND_TOP, or EXTEND_BOTTOM, really doesn't matter...

 

I never advice people to use the E_T though... except for testing... so you can see what it might blog off. ???

Link to comment

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...