rendered paste body#include "spn_functions"
#include "inc_item_props"
//script adds speed modifications based on equipped items with item_prop_speed_mod
const int ITEM_PROPERTY_SPEED_INCREASE = 134;
const int ITEM_PROPERTY_SPEED_DECREASE = 135;
const string PLAYER_SPEED_INCREASE = "player_speed_increase";
const string PLAYER_SPEED_DECREASE = "player_speed_decrease";
void ApplySpeedIncrease(object oPC);
void ApplySpeedDecrease(object oPC);
//equip script
void main()
{
//declarations
object oPC = GetPCItemLastEquippedBy();
object oItem = GetPCItemLastEquipped();
itemproperty ipTest = GetFirstItemProperty(oItem);
int nSpeedIncrease = GetLocalInt(oPC, PLAYER_SPEED_INCREASE),
bDoIncreaseSpeed = FALSE;
int nSpeedDecrease = GetLocalInt(oPC, PLAYER_SPEED_DECREASE),
bDoDecreaseSpeed = FALSE;
DSpeak("nCacheIncrease = " + IntToString(nSpeedIncrease));
DSpeak("nCacheDecrease = " + IntToString(nSpeedDecrease));
// start adding new properties
while(GetIsItemPropertyValid(ipTest))
{
if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_SPEED_INCREASE)
{
int iItemAdjust = 0;
if (GetItemPropertyCostTableValue(ipTest) == 0) iItemAdjust = 10;
else if(GetItemPropertyCostTableValue(ipTest) == 1) iItemAdjust = 20;
else if(GetItemPropertyCostTableValue(ipTest) == 2) iItemAdjust = 30;
else if(GetItemPropertyCostTableValue(ipTest) == 3) iItemAdjust = 40;
else if(GetItemPropertyCostTableValue(ipTest) == 4) iItemAdjust = 50;
else if(GetItemPropertyCostTableValue(ipTest) == 5) iItemAdjust = 60;
else if(GetItemPropertyCostTableValue(ipTest) == 6) iItemAdjust = 70;
else if(GetItemPropertyCostTableValue(ipTest) == 7) iItemAdjust = 80;
else if(GetItemPropertyCostTableValue(ipTest) == 8) iItemAdjust = 90;
else if(GetItemPropertyCostTableValue(ipTest) == 9) iItemAdjust = 100;
else if(GetItemPropertyCostTableValue(ipTest) == 10) iItemAdjust = 200;
else if(GetItemPropertyCostTableValue(ipTest) == 11) iItemAdjust = 300;
else if(GetItemPropertyCostTableValue(ipTest) == 12) iItemAdjust = 400;
else if(GetItemPropertyCostTableValue(ipTest) == 13) iItemAdjust = 500;
else if(GetItemPropertyCostTableValue(ipTest) == 14) iItemAdjust = 600;
else if(GetItemPropertyCostTableValue(ipTest) == 15) iItemAdjust = 700;
else if(GetItemPropertyCostTableValue(ipTest) == 16) iItemAdjust = 800;
else if(GetItemPropertyCostTableValue(ipTest) == 17) iItemAdjust = 900;
else if(GetItemPropertyCostTableValue(ipTest) == 18) iItemAdjust = 1000;
nSpeedIncrease += iItemAdjust;
bDoIncreaseSpeed = TRUE;
}
if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_SPEED_DECREASE)
{
int iItemAdjust = 0;
if (GetItemPropertyCostTableValue(ipTest) == 0) iItemAdjust = 10;
else if(GetItemPropertyCostTableValue(ipTest) == 1) iItemAdjust = 20;
else if(GetItemPropertyCostTableValue(ipTest) == 2) iItemAdjust = 30;
else if(GetItemPropertyCostTableValue(ipTest) == 3) iItemAdjust = 40;
else if(GetItemPropertyCostTableValue(ipTest) == 4) iItemAdjust = 50;
else if(GetItemPropertyCostTableValue(ipTest) == 5) iItemAdjust = 60;
else if(GetItemPropertyCostTableValue(ipTest) == 6) iItemAdjust = 70;
else if(GetItemPropertyCostTableValue(ipTest) == 7) iItemAdjust = 80;
else if(GetItemPropertyCostTableValue(ipTest) == 8) iItemAdjust = 90;
else if(GetItemPropertyCostTableValue(ipTest) == 9) iItemAdjust = 99;
nSpeedDecrease += iItemAdjust;
bDoDecreaseSpeed = TRUE;
}
ipTest = GetNextItemProperty(oItem);
}
// If the item had a speed mod itemproperty, handle the effect
object oSkin = GetPCSkin(oPC);
if(!GetIsObjectValid(oSkin))
{
//something odd going on here
DSpeak(GetName(oPC)+" has no skin!");
return;
}
if(bDoIncreaseSpeed)
{
SetLocalInt(oSkin, PLAYER_SPEED_INCREASE, nSpeedIncrease);
AssignCommand(oSkin, ApplySpeedIncrease(oPC));
}
if(bDoDecreaseSpeed)
{
SetLocalInt(oSkin, PLAYER_SPEED_DECREASE, nSpeedDecrease);
AssignCommand(oSkin, ApplySpeedDecrease(oPC));
}
}
void ApplySpeedIncrease(object oPC)
{
int nSpeedMod = GetLocalInt(OBJECT_SELF, PLAYER_SPEED_INCREASE);
//clean existing modification
effect eTest = GetFirstEffect(oPC);
//not needed, its OBJECT_SELF
//object oSkin = GetPCSkin(oPC);
while(GetIsEffectValid(eTest))
{
if(GetEffectCreator(eTest) == OBJECT_SELF &&
(GetEffectType(eTest) == EFFECT_TYPE_MOVEMENT_SPEED_INCREASE) &&
GetEffectDurationType(eTest) == DURATION_TYPE_PERMANENT
)
RemoveEffect(oPC, eTest);
eTest = GetNextEffect(oPC);
}
//add new modification
if (nSpeedMod > 0)
{
effect eSpeedMod = SupernaturalEffect(EffectMovementSpeedIncrease(nSpeedMod));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpeedMod, oPC);
//ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
// SupernaturalEffect(EffectMovementSpeedIncrease(nSpeedMod)),
// oPC, 99999.9);
DSpeak("Increasing Speed = " + IntToString(nSpeedMod));
}
else if (nSpeedMod = 0) // Avoids setting 0 bonus
{
DSpeak("Clearing Speed = " + IntToString(nSpeedMod));
}
}
void ApplySpeedDecrease(object oPC)
{
int nSpeedMod = GetLocalInt(OBJECT_SELF, PLAYER_SPEED_DECREASE);
//clean existing modification
effect eTest = GetFirstEffect(oPC);
//not needed, its OBJECT_SELF
//object oSkin = GetPCSkin(oPC);
while(GetIsEffectValid(eTest))
{
if(GetEffectCreator(eTest) == OBJECT_SELF &&
GetEffectType(eTest) == EFFECT_TYPE_MOVEMENT_SPEED_DECREASE &&
GetEffectDurationType(eTest) == DURATION_TYPE_PERMANENT
)
RemoveEffect(oPC, eTest);
eTest = GetNextEffect(oPC);
}
//add new modification
if (nSpeedMod > 0)
{
effect eSpeedMod = SupernaturalEffect(EffectMovementSpeedDecrease(nSpeedMod));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpeedMod, oPC);
//ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
// SupernaturalEffect(EffectMovementSpeedDecrease(nSpeedMod)), oPC, 99999.9);
DSpeak("Decreasing Speed = " + IntToString(nSpeedMod));
}
else if (nSpeedMod = 0) // Avoids setting 0 bonus
{
DSpeak("Clearing Speed = " + IntToString(nSpeedMod));
}
}