Note: LucasForums Archive Project
The content here was reconstructed by scraping the Wayback Machine in an effort to restore some of what was lost when LF went down. The LucasForums Archive Project claims no ownership over the content or assets that were archived on archive.org.

This project is meant for research purposes only.

Scripting help needed...

Page: 1 of 1
 Darth InSidious
10-07-2007, 9:45 AM
#1
I'm trying to get this script to perform a global check so that as each of five characters dies, it increases a global number. When the number reaches five, it's meant to spawn a new character. Obviously, I don't know in what order the characters will be killed, so I'm trying to make it possible to do in any order. I've tried using if(GetGlobal[blahblahblah]) elseelse functions, switch and case functions, etc etc but nothing will let me set the number above 1. Here's the script I've been using so far:


#include "k_inc_generic"
#include "k_inc_utility"
void main()
{
{
int nCurrentHP;
int nUser = GetUserDefinedEventNumber();
if(nUser == 1006) // DAMAGED
{
nCurrentHP=GetCurrentHitPoints();
if (nCurrentHP<20) {
CancelCombat (OBJECT_SELF);
ClearAllActions();
ChangeToStandardFaction(OBJECT_SELF, 5);

SetLocalBoolean(OBJECT_SELF,0,TRUE);

SetMinOneHP(OBJECT_SELF,FALSE);

}

}
object oItem = GetFirstItemInInventory(OBJECT_SELF);
while (GetIsObjectValid(oItem)) {
SetPlotFlag(oItem, FALSE);
DestroyObject(oItem, 0.0);
oItem = GetNextItemInInventory(OBJECT_SELF);

object oGoodbye;
oGoodbye = (OBJECT_SELF);
DelayCommand(1.0, DestroyObject(oGoodbye));

int nQMD = GetGlobalNumber("MasterDead");
int nNoMasterDead = GetScriptParameter( 0 );
int n1MD = GetScriptParameter( 1 );
int n2MD = GetScriptParameter( 2 );
int n3MD = GetScriptParameter( 3 );
int n4MD = GetScriptParameter( 4 );
int n5MD = GetScriptParameter( 5 );
int nSet1 = GetScriptParameter( 1 );
int nSet2 = GetScriptParameter( 2 );
int nSet3 = GetScriptParameter( 3 );
int nSet4 = GetScriptParameter( 4 );
int nSet5 = GetScriptParameter( 5 );

switch (nQMD)
{
case 0:
{

if( GetGlobalNumber("MasterDead") == nNoMasterDead )
{
SetGlobalNumber( "MasterDead", nSet1 );
SendMessageToPC(GetPartyLeader(), "DEBUG: GLOBAL NUMBER NOW SET TO 1");
}

else
{
}

}break;

case 1:
{
if(GetGlobalNumber("MasterDead") == n1MD)
{
SetGlobalNumber( "MasterDead", nSet2);
SendMessageToPC(GetPartyLeader(), "DEBUG: GLOBAL NUMBER NOW SET TO 2");
}
else
{
}
}break;

case 2:
{
if(GetGlobalNumber("MasterDead") == n2MD)
{
SetGlobalNumber( "MasterDead", nSet3);
SendMessageToPC(GetPartyLeader(), "DEBUG: GLOBAL NUMBER NOW SET TO 3");
}
else
{
}
}break;

case 3:
{
if(GetGlobalNumber("MasterDead") == n3MD)
{
SetGlobalNumber( "MasterDead", nSet4);
SendMessageToPC(GetPartyLeader(), "DEBUG: GLOBAL NUMBER NOW SET TO 4");
}
else
{
}
}break;

case 4:
{
if(GetGlobalNumber("MasterDead") == n4MD)
{
SetGlobalNumber( "MasterDead", nSet5);
SendMessageToPC(GetPartyLeader(), "DEBUG: GLOBAL NUMBER NOW SET TO 5!");
}
else
{
}
}break;

case 5:
{
if(GetGlobalNumber("MasterDead") == n5MD)
{
float x=0.98956f;
float y=-0.68433f;
float z=0.00f;
float r=118.35471f;
vector vecNPC=Vector(x,y,z);
location locNPC=Location(vecNPC, r);
object oNPC=CreateObject(OBJECT_TYPE_CREATURE,"atton",locNPC);
SendMessageToPC(GetPartyLeader(), "DEBUG: SPAWN ATTON");
}
else
{
}
}break;
}
}
}
}

Thanks.
 tk102
10-07-2007, 12:45 PM
#2
- I don't think you need any include scripts since you're not using their functions.

- What spawn-in flags are you setting in your OnSpawn script? If you're only using the OnDeath event, then you can remove the if(nUser == 1006)) block (which appears to be part of a Talk-Fight-Talk sequence).

- It appears this while-loop should probably have a closing brace that comes before you do anything globals.

- I think you're using GetScriptParameter(x) when you should just use x. EGetScriptParameter retrieves the P1..P5 parameters as set in DLGEditor for a dialog-called script. Since (I believe) the script you listed is a custom UserEvent script, there will be no script parameters to retrieve. Even if there were parameters to retrieve, you can't retrieve parameter 0 (only 1 to 5).


- In the code that deals with globals, you can probably simplify things quite a bit by querying the global value, incrementing it, and writing it back immediately. The debug string can be generated dynamically.

- There's a couple of syntax issues especially with braces (eg. you don't need braces within a case: element) though the compiler might allow it, it will make your own debugging more confusing.

Here's what I think your UserDefined script could appear like this:

/* di_userdef.nss
UserDefined script for the NPCs
only OnDeath event is defined... in the NPCs' OnSpawn script,
the GN_SetSpawnInCondition(SW_FLAG_EVENT_ON_DEATH); should
be uncommented */
void main()
{
int nCurrentHP;
int nUser = GetUserDefinedEventNumber();
if(nUser == 1007) // DATH
{
object oItem = GetFirstItemInInventory(OBJECT_SELF);
while (GetIsObjectValid(oItem))
{
SetPlotFlag(oItem, FALSE);
DestroyObject(oItem, 0.0);
oItem = GetNextItemInInventory(OBJECT_SELF);
}

DelayCommand(1.0, DestroyObject(OBJECT_SELF));

int nQMD = GetGlobalNumber("MasterDead");
nQMD++;
SetGlobalNumber( "MasterDead", nQMD );
string strDebug="DEBUG: GLOBAL NUMBER NOW SET TO "+IntToString(nQMD);
SendMessageToPC(GetPartyLeader(), strDebug);

if (nQMD==5)
{
float x=0.98956f;
float y=-0.68433f;
float z=0.00f;
float r=118.35471f;
vector vecNPC=Vector(x,y,z);
location locNPC=Location(vecNPC, r);
object oNPC=CreateObject(OBJECT_TYPE_CREATURE,"atton",locNPC);
SendMessageToPC(GetPartyLeader(), "DEBUG: SPAWN ATTON");
}
}
}
 Darth InSidious
10-08-2007, 10:46 AM
#3
It worked! Thanks, TK!
Page: 1 of 1