ericp07 Posted June 20, 2010 Share Posted June 20, 2010 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
jastey Posted June 20, 2010 Share Posted June 20, 2010 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
Jarno Mikkola Posted June 20, 2010 Share Posted June 20, 2010 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
ericp07 Posted June 20, 2010 Author Share Posted June 20, 2010 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
CoM_Solaufein Posted June 20, 2010 Share Posted June 20, 2010 Take Continue() out of the script. Its not a good idea to use that when spawning in creatures. Link to comment
ericp07 Posted June 20, 2010 Author Share Posted June 20, 2010 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
ericp07 Posted June 20, 2010 Author Share Posted June 20, 2010 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
Jarno Mikkola Posted June 20, 2010 Share Posted June 20, 2010 (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
cmorgan Posted June 20, 2010 Share Posted June 20, 2010 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 ) Link to comment
cmorgan Posted June 20, 2010 Share Posted June 20, 2010 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
ericp07 Posted June 20, 2010 Author Share Posted June 20, 2010 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
ericp07 Posted June 20, 2010 Author Share Posted June 20, 2010 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 ) 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
Jarno Mikkola Posted June 20, 2010 Share Posted June 20, 2010 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
cmorgan Posted June 21, 2010 Share Posted June 21, 2010 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
Jarno Mikkola Posted June 21, 2010 Share Posted June 21, 2010 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
Recommended Posts
Archived
This topic is now archived and is closed to further replies.