Author Topic: Custom Dev Crit save crashing mod on pc death  (Read 1038 times)

Legacy_NightbladeCH

  • Jr. Member
  • **
  • Posts: 78
  • Karma: +0/-0
Custom Dev Crit save crashing mod on pc death
« Reply #15 on: August 20, 2012, 03:25:12 pm »


               hehe indeed, it doesnt crash, however it doesnt effect pc's the way id like it too *sadface* any thoughts?
               
               

               
            

Legacy_ffbj

  • Hero Member
  • *****
  • Posts: 1097
  • Karma: +0/-0
Custom Dev Crit save crashing mod on pc death
« Reply #16 on: August 20, 2012, 04:07:25 pm »


               I gave it my best shot. So what is happening and did you remeber to delete the PCKiller int maybe on a delay command, although I don't see how that would affect it. So it's not working as you want.
So you are executing that script from your module on death. On the PC killer, and then what happens?
So I suppose you noticed I left out a semicolon here:

object oPCDead = GetLastPlayerDied();
if (GetLocalInt(oPC, "PCKiller") == 1)
 oPCDead = OBJECT_SELF;

Anyway post both your module ondeath and the critical hit one too. 
               
               

               


                     Modifié par ffbj, 20 août 2012 - 03:11 .
                     
                  


            

Legacy_NightbladeCH

  • Jr. Member
  • **
  • Posts: 78
  • Karma: +0/-0
Custom Dev Crit save crashing mod on pc death
« Reply #17 on: August 21, 2012, 02:50:46 am »


               For some reason it wont let me, keeps bringing up my other post when i go to add a new one

The Dev crit change is here: Startin at line 245
int DevCritSaveFix()
{
   int iCurrentHP = GetCurrentHitPoints(OBJECT_SELF);
   object oPC = GetLastKiller();
   int bMadeSave;
   string sResult; // *success* or *failure*
   object oPCDead = GetLastPlayerDied();
   if (GetLocalInt(oPC, "PCKiller") == 1)
   oPCDead = OBJECT_SELF;

   if(!GetIsDM(oPC))
   {
       if(iCurrentHP - GetTotalDamageDealt() > 0)   //check for damage/hp discrepancy
       {

and I added just that line to my mod on death, do you still need it?
               
               

               
            

Legacy_ffbj

  • Hero Member
  • *****
  • Posts: 1097
  • Karma: +0/-0
Custom Dev Crit save crashing mod on pc death
« Reply #18 on: August 21, 2012, 04:42:31 am »


               I think it should look more like this:

int DevCritSaveFix()
{
object oPC = GetLastKiller();
object oPCDead = GetLastPlayerDied();
if (GetLocalInt(oPC, "PCKiller") == 1)
oPCDead = OBJECT_SELF;

int iCurrentHP = GetCurrentHitPoints(OBJECT_SELF);
int bMadeSave;
string sResult; // *success* or *failure*

if(!GetIsDM(oPC))
{
if(iCurrentHP - GetTotalDamageDealt() > 0) //check for damage/hp discrepancy
{
//etc...
               
               

               
            

Legacy_NightbladeCH

  • Jr. Member
  • **
  • Posts: 78
  • Karma: +0/-0
Custom Dev Crit save crashing mod on pc death
« Reply #19 on: August 23, 2012, 04:51:08 pm »


               Ok so devcrit bit is here
http://pastebin.com/JaUwtpZa
and my mod on death
http://pastebin.com/3DJsdH5j

The default DC is still in effect currently, again thanks for all your help with this
               
               

               
            

Legacy_ffbj

  • Hero Member
  • *****
  • Posts: 1097
  • Karma: +0/-0
Custom Dev Crit save crashing mod on pc death
« Reply #20 on: August 23, 2012, 06:19:46 pm »


               I think may be a procedural one.  For instance look at the preamble to the script, and you see this:
22.//! USE - inlude this file in your OnDeath event script and add
23.//!
24.//!   if (DevCritSaveFix()) return; // exit if we arn't really dead.
25.//!
26.//! to your OnDeath event script - see included file nw_c2_default7

So what I really need to see is your altered nw_c2_default7, since that is what should be running this scipt.  So the procedure for normal creatures, would be just run the default7 with the devcrit included.  For the pc vs pc death the procedure would be to execute default7 from the module ondeath.  According to the writers the dev-crit part is supposed to be used as an include in your normal nw_c2_default7, though the last line is rather confusing since they say see the included file referring to default 7.  I think what they mean by that is default 7 is added to the script package not as an include file, a poor choice of wording from the author.  Since if you look at the top of DevCrit the script it does not use nw_c2_default7 as an include, it's the other way around. If you catch my meaning.
               
               

               
            

Legacy_ffbj

  • Hero Member
  • *****
  • Posts: 1097
  • Karma: +0/-0
Custom Dev Crit save crashing mod on pc death
« Reply #21 on: August 23, 2012, 06:48:06 pm »


               Ok that was some information, but I think the problem is you have the wrong script. What you have is a respawn script calling deve critical. Take a look.

1.//::///////////////////////////////////////////////
2.//:: Respawn System OnDeath
3.//:: res_ondeath.nss
4.//:://////////////////////////////////////////////
5./*
6. This script Clears Factions and Pops up the
7. Death GUI
8.*/
9.//:://////////////////////////////////////////////
10.//:: Created By: Brent Knowles
11.//:: Created On: November 6, 2001
12.//:://////////////////////////////////////////////
13.// #include "DevCritFix"
14.
15.void main()
16.{
17.
18. object oPCDead = GetLastPlayerDied();
19. object oPC = GetLastKiller();
20. if (GetIsPC(oPCDead) && GetIsPC(oPC))
21. {
22. SetLocalInt(oPC, "PCKiller", 1);
23. ExecuteScript("DevCritFix",oPC);
24. }
25.
26. object oPlayer = GetLastPlayerDied();
27.
28. // * make friendly to Each of the 3 common factions
29. AssignCommand(oPlayer, ClearAllActions());
30. // * Note: waiting for Sophia to make SetStandardFactionReptuation to clear all personal reputation
31. if (GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oPlayer) <= 10)
32. { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
33. SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 80, oPlayer);
34. }
35. if (GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oPlayer) <= 10)
36. { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
37. SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 80, oPlayer);
38. }
39. if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) <= 10)
40. { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
41. SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 80, oPlayer);
42. }
43.
44.// DelayCommand(2.5, PopUpGUIPanel(oPlayer, GUI_PANEL_PLAYER_DEATH));
45. DelayCommand(2.5, PopUpDeathGUIPanel(oPlayer, TRUE, TRUE, 66487));
46.}

So that is the module on respawn script. What you need to do is look at your module on death, go to edit, module properties, and module on death, it should look a lot like the standard one with the few lines added about PC on PC death. I think you should be able to execute the devcrit script from there, and eventually return the respawn script to default, since that will have no effect as it only fires when the pc respawns.
So standard module on death:

//::///////////////////////////////////////////////
//:: Death Script
//:: NW_O0_DEATH.NSS
//:: Copyright © 2008 Bioware Corp.
//:://////////////////////////////////////////////
/*
This script handles the default behavior
that occurs when a player dies.
//the module ondeath script for a pc
/::///////////////////////////////////////////////
//:: Death Script
//:: NW_O0_DEATH.NSS
//:: Copyright © 2008 Bioware Corp.
//:://////////////////////////////////////////////
/*
This script handles the default behavior
that occurs when a player dies.

BK: October 8 2002: Overriden for Expansion

Deva Winblood: April 21th, 2008: Modified to
handle dismounts when PC dies while mounted.

*/
//:://////////////////////////////////////////////
//:: Created By: Brent Knowles
//:: Created On: November 6, 2001
//:://////////////////////////////////////////////

#include "x3_inc_horse"

/*
void ClearAllFactionMembers(object oMember, object oPlayer)
{
// AssignCommand(oMember, SpeakString("here"));
AdjustReputation(oPlayer, oMember, 100);
SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
object oClear = GetFirstFactionMember(oMember, FALSE);
while (GetIsObjectValid(oClear) == TRUE)
{
ClearPersonalReputation(oPlayer, oClear);
oClear = GetNextFactionMember(oMember, FALSE);
}
} */
void Raise(object oPlayer)
{
effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION);

effect eBad = GetFirstEffect(oPlayer);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer);

//Search for negative effects
while(GetIsEffectValid(eBad))
{
if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
{
//Remove effect if it is negative.
RemoveEffect(oPlayer, eBad);
}
eBad = GetNextEffect(oPlayer);
}
//Fire cast spell at event for the specified target
SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer);
}


///////////////////////////////////////////////////////////////[ MAIN ]/////////
void main()
{
object oPlayer = GetLastPlayerDied();
object oHorse;
object oInventory;
string sID;
int nC;
string sT;
string sR;
int nCH;
int nST;
object oItem;
effect eEffect;
string sDB="X3SADDLEBAG"+GetTag(GetModule());
if (GetStringLength(GetLocalString(GetModule(),"X3_SADDLEBAG_DATABASE"))>0) sDB=GetLocalString(GetModule(),"X3_SADDLEBAG_DATABASE");
if (HorseGetIsMounted(oPlayer))
{ // Dismount and then die
//SetCommandable(FALSE,oPlayer);
//ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer);
DelayCommand(0.3,HORSE_SupportResetUnmountedAppearance(oPlayer));
DelayCommand(3.0,HORSE_SupportCleanVariables(oPlayer));
DelayCommand(1.0,HORSE_SupportRemoveACBonus(oPlayer));
DelayCommand(1.0,HORSE_SupportRemoveHPBonus(oPlayer));
DelayCommand(1.1,HORSE_SupportRemoveMountedSkillDecreases(oPlayer));
DelayCommand(1.1,HORSE_SupportAdjustMountedArcheryPenalty(oPlayer));
DelayCommand(1.2,HORSE_SupportOriginalSpeed(oPlayer));
if (!GetLocalInt(GetModule(),"X3_HORSE_NO_CORPSES"))
{ // okay to create lootable horse corpses
sR=GetSkinString(oPlayer,"sX3_HorseResRef");
sT=GetSkinString(oPlayer,"sX3_HorseMountTag");
nCH=GetSkinInt(oPlayer,"nX3_HorseAppearance");
nST=GetSkinInt(oPlayer,"nX3_HorseTail");
nC=GetLocalInt(oPlayer,"nX3_HorsePortrait");
if (GetStringLength(sR)>0&&GetStringLeft(sR,GetStringLength(HORSE_PALADIN_PREFIX))!=HORSE_PALADIN_PREFIX)
{ // create horse
oHorse=HorseCreateHorse(sR,GetLocation(oPlayer),oPlayer,sT,nCH,nST);
SetLootable(oHorse,TRUE);
SetPortraitId(oHorse,nC);
SetLocalInt(oHorse,"bDie",TRUE);
AssignCommand(oHorse,SetIsDestroyable(FALSE,TRUE,TRUE));
} // create horse
} // okay to create lootable horse corpses
oInventory=GetLocalObject(oPlayer,"oX3_Saddlebags");
sID=GetLocalString(oPlayer,"sDB_Inv");
if (GetIsObjectValid(oInventory))
{ // drop horse saddlebags
if (!GetIsObjectValid(oHorse))
{ // no horse created
HORSE_SupportTransferInventory(oInventory,OBJECT_INVALID,GetLocation(oPlayer),TRUE);
} // no horse created
else
{ // transfer to horse
HORSE_SupportTransferInventory(oInventory,oHorse,GetLocation(oHorse),TRUE);
//DelayCommand(2.0,PurgeSkinObject(oHorse));
//DelayCommand(3.0,KillTheHorse(oHorse));
//DelayCommand(1.8,PurgeSkinObject(oHorse));
} // transfer to horse
} // drop horse saddlebags
else if (GetStringLength(sID)>0)
{ // database based inventory
nC=GetCampaignInt(sDB,"nCO_"+sID);
while(nC>0)
{ // restore inventory
sR=GetCampaignString(sDB,"sR"+sID+IntToString(nC));
sT=GetCampaignString(sDB,"sT"+sID+IntToString(nC));
nST=GetCampaignInt(sDB,"nS"+sID+IntToString(nC));
nCH=GetCampaignInt(sDB,"nC"+sID+IntToString(nC));
DeleteCampaignVariable(sDB,"sR"+sID+IntToString(nC));
DeleteCampaignVariable(sDB,"sT"+sID+IntToString(nC));
DeleteCampaignVariable(sDB,"nS"+sID+IntToString(nC));
DeleteCampaignVariable(sDB,"nC"+sID+IntToString(nC));
if (!GetIsObjectValid(oHorse))
{ // no lootable corpse
oItem=CreateObject(OBJECT_TYPE_ITEM,sR,GetLocation(oPlayer),FALSE,sT);
} // no lootable corpse
else
{ // lootable corpse
oItem=CreateItemOnObject(sR,oHorse,nST,sT);
} // lootable corpse
if (GetItemStackSize(oItem)!=nST) SetItemStackSize(oItem,nST);
if (nCH>0) SetItemCharges(oItem,nCH);
nC--;
} // restore inventory
DeleteCampaignVariable(sDB,"nCO_"+sID);
//DelayCommand(2.0,PurgeSkinObject(oHorse));
if (GetIsObjectValid(oHorse)&&GetLocalInt(oHorse,"bDie")) DelayCommand(3.0,KillTheHorse(oHorse));
//DelayCommand(2.5,PurgeSkinObject(oHorse));
} // database based inventory
else if (GetIsObjectValid(oHorse))
{ // no inventory
//DelayCommand(1.0,PurgeSkinObject(oHorse));
DelayCommand(2.0,KillTheHorse(oHorse));
//DelayCommand(1.8,PurgeSkinObject(oHorse));
} // no inventory
//eEffect=EffectDeath();
//DelayCommand(1.6,ApplyEffectToObject(DURATION_TYPE_INSTANT,eEffect,oPlayer));
//DelayCommand(1.7,SetCommandable(TRUE,oPlayer));
//return;
} // Dismount and then die

// * increment global tracking number of times that I died
SetLocalInt(oPlayer, "NW_L_PLAYER_DIED", GetLocalInt(oPlayer, "NW_L_PLAYER_DIED") + 1);

//BEGIN ADDED IN CODE ffbj
object oPCDead = GetLastPlayerDied();
object oPC = GetLastKiller();
if (GetIsPC(oPCDead) && GetIsPC(oPC))
{
SetLocalInt(oPC, "PCKiller", 1);
ExecuteScript("nw_c2_default7",oPC);
//or whatever the name of the standard ondeath script for monsters you have.
//now the code should run correctly on the pc
}
//END ADDED IN CODE



// * BK: Automation Control. Autopcs ignore death
if (GetLocalInt(oPlayer, "NW_L_AUTOMATION") == 10)
{
Raise(oPlayer);
DelayCommand(1.0, ExecuteScript("crawl", OBJECT_SELF));
return; // Raise and return
}


// * Handle Spirit of the Wood Death
string sArea = GetTag(GetArea(oPlayer));
/*
if (sArea == "MAP_M2Q2F2" && GetDistanceBetweenLocations(GetLocation(GetObjectByTag("M2Q2F2_M2Q2G")), GetLocation(oPlayer)) < 5.0 && GetLocalInt(GetModule(),"NW_M2Q2E_WoodsFreed") == 0)
{
int bValid;

Raise(oPlayer);
string sDestTag = "WP_M2Q2GtoM2Q2F";
object oSpawnPoint = GetObjectByTag(sDestTag);
AssignCommand(oPlayer,JumpToLocation(GetLocation(oSpawnPoint)));
return;

}
*/
// * in last level of the Sourcestone, move the player to the beginning of the area
// * May 16 2002: or the main area of the Snowglobe (to prevent plot logic problems).
// * May 21 2002: or Castle Never
if (sArea == "M4Q1D2" || sArea == "M3Q3C" || sArea == "MAP_M1Q6A")
{

//Raise(oPlayer);
//string sDestTag = "M4QD07_ENTER";
//object oSpawnPoint = GetObjectByTag(sDestTag);
// AssignCommand(oPlayer, DelayCommand(1.0, JumpToLocation(GetLocation(oSpawnPoint))));
// * MAY 2002: Just popup the YOU ARE DEAD panel at this point
DelayCommand(2.5, PopUpDeathGUIPanel(oPlayer,FALSE, TRUE, 66487));
return;
}

// * make friendly to Each of the 3 common factions
AssignCommand(oPlayer, ClearAllActions());
// * Note: waiting for Sophia to make SetStandardFactionReptuation to clear all personal reputation
if (GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oPlayer) <= 10)
{ SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 80, oPlayer);
}
if (GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oPlayer) <= 10)
{ SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 80, oPlayer);
}
if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) <= 10)
{ SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 80, oPlayer);
}

DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH));

}
///////////////////////////////////////////////////////////////[ MAIN ]/////////
Maybe it would be best if you pm me so you can get my e-mail and then zip your module and send it to me. So I can see what's going on, if this does not help. I added in the few lines of code to this standard module ondeath to show the procedure.
               
               

               


                     Modifié par ffbj, 23 août 2012 - 06:01 .
                     
                  


            

Legacy_NightbladeCH

  • Jr. Member
  • **
  • Posts: 78
  • Karma: +0/-0
Custom Dev Crit save crashing mod on pc death
« Reply #22 on: August 24, 2012, 04:22:58 am »


               Hey. ok i can do that. However double checking the script i sent you WAS my mod ondeath script. The way I looked at it was I had to add the script to the playeronDeath and the default 7, because the default 7 controls the npcs, where as the other is just for pc's. Unless i misunderstand it
               
               

               
            

Legacy_ffbj

  • Hero Member
  • *****
  • Posts: 1097
  • Karma: +0/-0
Custom Dev Crit save crashing mod on pc death
« Reply #23 on: August 24, 2012, 06:09:52 am »


               The default 7 is what contains the devcrit script. You are just using that script to fire the devcrit check. The module ondeath you sent looks like a respawn script.
Here is what it says at the very top:
1.//::///////////////////////////////////////////////
2.//:: Respawn System OnDeath
3.//:: res_ondeath.nss
4.//:://////////////////////////////////////////////
5./*
Anyway executing the script default 7 may work. There is no script DevCrit, it's an include so the part that is exectuting a nonexistent script is pointless.  That's where you could change it to executing default 7, which
has the DevCrit check included
..void main()
16.{
17.
18. object oPCDead = GetLastPlayerDied();
19. object oPC = GetLastKiller();
20. if (GetIsPC(oPCDead) && GetIsPC(oPC))
21. {
22. SetLocalInt(oPC, "PCKiller", 1);
23. ExecuteScript("nw_c2_default7",oPC);//so you could try changing this to.
24. }
And see if that works.  So that may work and death script is fine as it is, just make those changes.
               
               

               


                     Modifié par ffbj, 24 août 2012 - 05:20 .