Initial Upload
Initial Upload
This commit is contained in:
166
_module/nss/hls_wandlab.nss
Normal file
166
_module/nss/hls_wandlab.nss
Normal file
@@ -0,0 +1,166 @@
|
||||
//hahnsoo's wand creation system
|
||||
//Credits: HCR by Archaegeo
|
||||
//Potion/Scroll creation system by Pothole (The inspiration and base code of this system)
|
||||
//Various wands by Syrsuro
|
||||
//Hunger Thirst Fatigue system by Edward Beck
|
||||
//
|
||||
//To use: Place in the OnSpellCastAt event of a placeable, and make sure the
|
||||
//placeable can have an inventory. Place a Wand item (any wand item) and an
|
||||
//amount of items of any kind with a total value greater than the base cost
|
||||
//of the wand (Spell level * Caster level * 375). Cast a spell of 0 - 4 levels
|
||||
//that targets the placeable, and your wand will be created in the
|
||||
//placeable object. Variables are set in hls_defaults.
|
||||
//Note: This is meant to be used with Syrsuro's Treasure Generation system, as
|
||||
//there are several wands in that system that are used to avoid redundancy. If
|
||||
//you wish to use this without Syrsuro's Treasure Generation system, create the
|
||||
//wands that are missing... the list is in hls_inc_convert, with the original
|
||||
//Tag/resref names and what they are converted to in the file. Create the wand
|
||||
//with the listed spell in the comments, and set the tag and the resref to the
|
||||
//original tag/resref listed.
|
||||
|
||||
#include "hls_defaults"
|
||||
#include "hls_inc_spell"
|
||||
#include "hls_inc_convert"
|
||||
|
||||
void MakePlayerFatigued(object oPC, string message = "")
|
||||
{
|
||||
if (!GetIsPC(oPC)) return;
|
||||
int bFatigued = GetLocalInt(oPC, "bFatigued");
|
||||
int bExhausted = GetLocalInt(oPC, "bExhausted");
|
||||
if (bFatigued || bExhausted) return;
|
||||
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectCurse(2, 2, 0, 0, 0, 0)), oPC));
|
||||
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectMovementSpeedDecrease(60)), oPC));
|
||||
if (message!="") FloatingTextStringOnCreature(message, oPC, FALSE);
|
||||
SetLocalInt(oPC,"bFatigued",TRUE);
|
||||
}
|
||||
|
||||
void MakePlayerExhausted(object oPC, string message = "")
|
||||
{
|
||||
if (!GetIsPC(oPC)) return;
|
||||
int bFatigued = GetLocalInt(oPC, "bFatigued");
|
||||
int bExhausted = GetLocalInt(oPC, "bExhausted");
|
||||
if (bExhausted) return;
|
||||
if (bFatigued) {
|
||||
RemoveEffect(oPC,ExtraordinaryEffect(EffectCurse(2, 2, 0, 0, 0, 0)));
|
||||
RemoveEffect(oPC,ExtraordinaryEffect(EffectMovementSpeedDecrease(60)));
|
||||
SetLocalInt(oPC,"bFatigued",FALSE);
|
||||
}
|
||||
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectCurse(6, 6, 0, 0, 0, 0)), oPC));
|
||||
AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectMovementSpeedDecrease(80)), oPC));
|
||||
if (message!="") FloatingTextStringOnCreature(message, oPC, FALSE);
|
||||
SetLocalInt(oPC,"bExhausted",TRUE);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
float iCantrip = 1.0f;
|
||||
int iSpellID = GetLastSpell();
|
||||
string sSpellID = IntToString(iSpellID);
|
||||
if (GetStringLength(sSpellID) == 2)
|
||||
sSpellID = "0" + sSpellID;
|
||||
if (GetStringLength(sSpellID) == 1)
|
||||
sSpellID = "00" + sSpellID;
|
||||
object oPlayer = GetLastSpellCaster();
|
||||
int bFatigued = GetLocalInt(oPlayer, "bFatigued");
|
||||
int bExhausted = GetLocalInt(oPlayer, "bExhausted");
|
||||
|
||||
int iCost;
|
||||
int nXP = GetXP(oPlayer);
|
||||
int nXPCost;
|
||||
int iSpellLevel = ReturnSpellLevel(iSpellID);
|
||||
int iCastLevel = ReturnCasterLevel(iSpellID, GetCasterLevel(oPlayer));
|
||||
string sCastLevel;
|
||||
int nTime;
|
||||
string sWandTag;
|
||||
int iSuccess;
|
||||
int nHD = GetHitDice ( oPlayer );
|
||||
int nMinXP = ((( nHD * ( nHD - 1) ) / 2 ) * 1000) + 1; //Minimum amount of XP needed to keep level
|
||||
|
||||
object oMod = GetModule();
|
||||
string sPCName = GetName(oPlayer);
|
||||
string sCDK = GetPCPublicCDKey(oPlayer);
|
||||
|
||||
if (iCastLevel > GetCasterLevel(oPlayer))
|
||||
{
|
||||
FloatingTextStringOnCreature("You are not experienced enough to imbue this wand.", oPlayer, FALSE);
|
||||
return;
|
||||
}
|
||||
if (iSpellLevel > 4)
|
||||
{
|
||||
FloatingTextStringOnCreature("Your spell is too powerful to imbue into a wand.", oPlayer, FALSE);
|
||||
return;
|
||||
}
|
||||
if (iSpellLevel == 0)
|
||||
{
|
||||
iCantrip = 0.5f;
|
||||
iSpellLevel = 1;
|
||||
}
|
||||
iCost = FloatToInt(WANDCOST * iCantrip * IntToFloat(iSpellLevel*iCastLevel) );
|
||||
nXPCost = iCost/25;
|
||||
if (CheckWandMaterials(iCost/2))
|
||||
{
|
||||
if (((nXP >= nXPCost) && ((nXP-nXPCost) >= nMinXP)) || (!WANDXP))
|
||||
{
|
||||
|
||||
//Take XP
|
||||
if (WANDXP)
|
||||
SetXP(oPlayer, nXP-nXPCost);
|
||||
|
||||
//Destroy Objects
|
||||
DestroyInventory();
|
||||
|
||||
//Set Name of Wand resref
|
||||
if (iCastLevel < 10)
|
||||
sCastLevel = IntToString(iCastLevel);
|
||||
else
|
||||
{
|
||||
switch(iCastLevel)
|
||||
{
|
||||
case 10: sCastLevel = "0"; break;
|
||||
case 11: sCastLevel = "a"; break;
|
||||
case 12: sCastLevel = "b"; break;
|
||||
case 13: sCastLevel = "c"; break;
|
||||
case 14: sCastLevel = "d"; break;
|
||||
case 15: sCastLevel = "e"; break;
|
||||
case 16: sCastLevel = "f"; break;
|
||||
case 17: sCastLevel = "g"; break;
|
||||
case 18: sCastLevel = "h"; break;
|
||||
case 19: sCastLevel = "i"; break;
|
||||
case 20: sCastLevel = "j"; break;
|
||||
}
|
||||
}
|
||||
|
||||
sWandTag = "wand_" + sSpellID + sCastLevel;
|
||||
//Check for Conversions
|
||||
string sFinalTag = ConvertMagicItem(sWandTag);
|
||||
|
||||
//Create Magical Item
|
||||
|
||||
object oNewWand = CreateItemOnObject(sFinalTag, OBJECT_SELF);
|
||||
FloatingTextStringOnCreature("You have created a " + GetName(oNewWand) +"! It cost you " + IntToString(nXPCost) + " XP.", oPlayer, FALSE);
|
||||
|
||||
if (WANDFATIGUE)
|
||||
{
|
||||
if (!bFatigued && !bExhausted)
|
||||
MakePlayerFatigued(oPlayer,"You are fatigued from creating the wand.");
|
||||
else {
|
||||
SetLocalInt(oPlayer, "bFatigued", FALSE);
|
||||
SetLocalInt(oPlayer, "bExhausted", FALSE);
|
||||
MakePlayerExhausted(oPlayer,"You are exhausted from your efforts.");
|
||||
}
|
||||
}
|
||||
}
|
||||
else //Not enough xp
|
||||
{
|
||||
FloatingTextStringOnCreature("Not enough XP. It costs " + IntToString(nXPCost) + " XP. You need to have a minimum XP level of " + IntToString(nMinXP + nXPCost) + " to create this wand.", oPlayer, FALSE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FloatingTextStringOnCreature("Not enough raw materials to create the wand.", oPlayer, FALSE);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user