combat dummy that lets the PC exercise a lengthy training session.
does not need a creature object to simulate combat status.
player needs to deplete a set amount of HP, depending on their level, to complete a training session.
rewards XP one time during a specific timespan (default 1 hour realtime) ONLY if they complete a training session. (no xp if they abort/cancel a session) players will be able to re-train asap, but will not get any XP until said timer runs out. it's not possible to 'farm' xp, it's just a small spice up...you can change those values easily.
combat dummy records some basic statistics like number of hits and total damage done. It displays them during combat and a final statistic after the session is complete.
adds FX based on player damage
accounts for multiplayer.. only one active training session per dummy. other PCs attacking the same dummy get ignored (in theorie at least, never tested so far)
Posted by Alaster Wolf at 2010-04-10 04:47:51 Voted 9.00 on 04/10/10
Very usable.
Posted by Primeval Atom at 2009-08-23 15:05:47 Voted 10.00 on 08/23/09
Fantastic idea :) _________________________ (\__/)
(='.'=) This is Bunny. Copy and paste bunny into
(")_(") your signature to help him gain world domination.
Found a slight bug with this script for NWN1 (not NWN2). I've noticed that if a player starts to fight the dummy then logs before the dummy aborts their session, the dummy is then bugged until either 1) the server is reset or 2) the players logs back in later and attacks the same dummy, completing their session. It keeps giving "combat dummy is busy" message otherwise. Is there a way to fix this in the script, like a reset button to auto-refresh dummy when needed?
Found a slight bug with this script for NWN1 (not NWN2). I've noticed that if a player starts to fight the dummy then logs before the dummy aborts their session, the dummy is then bugged until either 1) the server is reset or 2) the players logs back in later and attacks the same dummy, completing their session. It keeps giving "combat dummy is busy" message otherwise. Is there a way to fix this in the script, like a reset button to auto-refresh dummy when needed?
Posted by rikki.o at 2007-01-29 06:38:24 Voted 7.75 on 01/29/07
Nice
Posted by hexmendacious at 2007-01-22 13:34:50 Voted 9.25 on 01/22/07
This works great, and is easy to install.
Posted by styzygy at 2006-12-10 05:03:04 Voted 9.75 on 12/10/06
Great stuff. Thanks for your excellent work!
Posted by Dreamwarder at 2006-08-27 09:13:24 Voted 10.00 on 08/27/06
Have used this for a long time, and will continue to.
Posted by tango1 at 2006-08-04 11:15:16 Voted 9.25 on 08/04/06
would be cool if the combat dummies can be made immune to spells or feats like harm or dev crit to prevent abuse. overall, a really great script!
Posted by Night Below at 2006-07-22 19:13:00 Voted 10.00 on 07/22/06
This is really awsome and found its way into our academies.
Posted by ffbj at 2006-02-19 07:49:41 Voted 9.50 on 02/19/06
Love it and use it.
Posted by JPLewis at 2005-09-24 21:02:35 Voted 10.00 on 09/24/05
I use it. =)
Posted by Blade421 at 2004-11-01 21:20:25 Voted 8.25 on 11/01/04
Posted by Ben_Harrison at 2004-10-01 07:51:08 Voted 8.75 on 10/01/04
Excellent script, very useful, easy to implement.
Posted by Ben_Harrison at 2004-10-01 07:50:00 Voted 8.75 on 10/01/04
Guess I'm a little late leaving my comment...
Anyway, this is an awesome script, no server should be without something like this. I've modified it a little for my own purposes, and used Sir Elric's fix, and it works perfectly. Thanks."We started off trying to set up a small anarchist community, but people wouldn't obey the rules."
Posted by Ben_Harrison at 2004-10-01 07:49:00 Voted 8.75 on 10/01/04
Guess I'm a little late leaving my comment...
Anyway, this is an awesome script, no server should be without something like this. I've modified it a little for my own purposes, and used Sir Elric's fix, and it works perfectly. Thanks."We started off trying to set up a small anarchist community, but people wouldn't obey the rules."
Posted by Gomisan at 2004-08-23 21:11:27 Voted 9.75 on 08/23/04
Posted by Gomi ( 203.87.xxx.xxx ) at 2004-06-17 23:27:00
Thanks Sir Elric.
I've implemented the Comabt Dummys with Sir Elric's code modification and they seem to be working well.
Perhaps the core system needs an update with that fix.
Posted by Greenlion420 at 2004-05-19 13:08:44 Voted 10.00 on 05/19/04
Yup, good stuff as always Knat. Thanks :)
Posted by c00lm at 2004-05-05 11:50:40 Voted 10.00 on 05/05/04
Posted by Bane_Moonglum at 2004-04-17 14:36:31 Voted 10.00 on 04/17/04
Very nice to add to a barracks or training temple
Posted by jboy123 at 2004-03-12 16:54:54 Voted 8.00 on 03/12/04
Posted by Civious at 2004-03-12 13:06:16 Voted 10.00 on 03/12/04
Simple and elegant. Another good script by Knat.
Posted by ManChild at 2004-03-11 09:52:37 Voted 10.00 on 03/11/04
Posted by Sir_Elric at 2004-03-09 18:50:00 Voted 7.00
assign this script to the OnDamaged event of a placeable
make placeable non-static & usable
assign 10.000 hp to the placeable
set hardness and all saves to 0
*/
//:://////////////////////////////////////////////
//:: Created By: Knat
//:: Created On: 5/2003
//:://////////////////////////////////////////////
does not need a creature object to simulate and track combat status.
player needs to deplete a set amount of HP, depending on their level, to complete
a training session.
rewards XP one time during a specific timespan (default 1 hour realtime) ONLY
if they complete a training session. (no xp if they abort/cancel a session)
players will be able to re-train asap, but will not get any XP until said timer runs out.
it's not possible to "farm" xp, it's just a small spice up...
you can change those values easily.
combat dummy records some basic statistics like number of hits and total damage
done. It displays them during combat and a final statistic after the session is complete.
adds FX based on player damage
accounts for multiplayer.. only one active training session per dummy. other PCs attacking the
same dummy get ignored (in theorie at least, never tested so far)
*/
int PLC_DUMMY_HP_MODIFIER = 40; // dummy-hp = modifier + (pc-level * modifier)
float PLC_DUMMY_XP_MODIFIER = 0.2; // adjust this to control XP output (xp = dummy-hp * modifier)
float PLC_DUMMY_XP_TIMER = 3600.0; // XP timer in seconds. Player won't get XP again until this timer runs out
void DummyCheckSession(object oDummy = OBJECT_SELF)
{
object oUser = GetLocalObject(oDummy,"PLC_INTERACT_USER");
if(GetIsObjectValid(oUser))
{
if(GetIsInCombat(oUser)) // still in combat, restart timer
DelayCommand(5.0,DummyCheckSession(oDummy));
else
{
// not in combat, abort session
FloatingTextStringOnCreature("Session Aborted...",oUser);
// delete & re-create dummy
string sResRef = GetResRef(oDummy); location lLoc = GetLocation(oDummy);
AssignCommand(GetModule(),DelayCommand(0.1,DummyRespawn(sResRef,lLoc)));;
DestroyObject(oDummy);
}
}
}
void DummyMain(object oPC, object oDummy)
{
// initial user interaction, starts training session
if( !GetLocalInt(oDummy,"PLC_INTERACT_INUSE") )
{
// fix multiple dummy creation - SE
SetLocalInt(oDummy,"RECREATE_COMBATDUMMY",TRUE);
// set target PC
SetLocalObject(oDummy,"PLC_INTERACT_USER",oPC);
// set InUse flag
SetLocalInt(oDummy,"PLC_INTERACT_INUSE",TRUE);
// set strength of dummy based on player level
SetLocalInt(oDummy,"PLC_INTERACT_SESSIONHP", ((GetLevelByPosition(1,oPC) + GetLevelByPosition(2,oPC) + GetLevelByPosition(3,oPC)) * PLC_DUMMY_HP_MODIFIER ) + PLC_DUMMY_HP_MODIFIER );
// initiate "check for session abort/cancel"
// this function polls every 5 sec and checks if the player is still
// fighting with the dummy. if not, session gets aborted
// and dummy gets re-created. this deletes all variables and resets
// everything to clean state.
// this "pseudo heartbeat" only runs during PCdummy interaction
// and is very small
DelayCommand(5.0,DummyCheckSession(oDummy));
FloatingTextStringOnCreature("Session Started - Dummy Strength: "+IntToString(GetLocalInt(oDummy,"PLC_INTERACT_SESSIONHP")),oPC);
if(GetLocalInt(oPC,"PLC_INTERACT_COMBATDUMMY_NOXP"))
FloatingTextStringOnCreature("You won't get XP this time",oPC);
}
object oUser = GetLocalObject(oDummy,"PLC_INTERACT_USER");
if(oUser == oPC)
{
int nSessionHP = GetLocalInt(oDummy,"PLC_INTERACT_SESSIONHP");
int nTotalDamage = GetMaxHitPoints() - GetCurrentHitPoints();
int nHitCount;
int nLastTotalDamage = GetLocalInt(oDummy,"PLC_INTERACT_LASTHP");
nHitCount = GetLocalInt(oDummy,"PLC_INTERACT_HITCOUNT");
// apply some effects based on damage
int nDamage = nTotalDamage - nLastTotalDamage;
if (nDamage > 24) ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(75), OBJECT_SELF);
if (nDamage > 12) ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(281), OBJECT_SELF);
if (nDamage > 6) ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(112), OBJECT_SELF);
if (nDamage > 3) ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(236 + d3()), OBJECT_SELF);
FloatingTextStringOnCreature("Total Damage: " +IntToString(nTotalDamage)+ " Hits: "+IntToString(nHitCount),oPC);
if(nTotalDamage > nSessionHP) // session done - dummy HP depleted
{
if(GetLocalInt(oDummy,"RECREATE_COMBATDUMMY")==FALSE)//fix - SE
{
return;
}
FloatingTextStringOnCreature("You have finished your training session",oPC);
// report final statistic
AssignCommand(GetModule(),DelayCommand(4.0,FloatingTextStringOnCreature("You inflicted "+IntToString(nTotalDamage)+ " damage to the dummy with "+IntToString(nHitCount)+" hits",oPC)));
AssignCommand(GetModule(),DelayCommand(6.0,FloatingTextStringOnCreature("Your average damage is " + IntToString(nTotalDamage/nHitCount)+" per attack",oPC)));
// award xp only if permitted
if(GetLocalInt(oPC,"PLC_INTERACT_COMBATDUMMY_NOXP"))
AssignCommand(GetModule(),DelayCommand(8.0,FloatingTextStringOnCreature("No XP reward ! You trained too recently...",oPC)));
else
{
// award xp and report it to the user
AssignCommand(GetModule(),DelayCommand(8.0,FloatingTextStringOnCreature("You earned " + IntToString( FloatToInt( IntToFloat(nSessionHP) * PLC_DUMMY_XP_MODIFIER ) ) + " xp for your training",oPC)));
AssignCommand(GetModule(),DelayCommand(9.0,GiveXPToCreature(oPC,FloatToInt( IntToFloat(nSessionHP)* PLC_DUMMY_XP_MODIFIER ) ) ) );
// set no-xp flag
SetLocalInt(oPC,"PLC_INTERACT_COMBATDUMMY_NOXP",TRUE);
// set deletion timer for no-xp flag
AssignCommand(GetModule()
,DelayCommand(PLC_DUMMY_XP_TIMER,DeleteLocalInt(oPC,"PLC_INTERACT_COMBATDUMMY_NO
XP")));
}
// destroy & re-create dummy
SetLocalInt(oDummy,"RECREATE_COMBATDUMMY",FALSE);//fix - SE
string sResRef = GetResRef(oDummy); location lLoc = GetLocation(oDummy);
AssignCommand(GetModule(),DelayCommand(0.1,DummyRespawn(sResRef,lLoc)));;
DestroyObject(oDummy);
}
}
else
SendMessageToPC(oPC,"Dummy is currently busy...");
}
if(GetIsObjectValid(oLastDamager))
{
//SendMessageToPC(GetFirstPC(),"Last Damager: "+GetName(oLastDamager));
DummyMain(oLastDamager,OBJECT_SELF);
}
}City of Melnibone - PW
ausnwn2.dyndns.org:5121 _________________________ City of Melnibone
ausnwn.dyndns.org:5121
Posted by Sir_Elric at 2004-03-09 17:10:00 Voted 7.00
Knat also because there are say 2 - 3 hits in a round the dummy gets re-created that amount of times at the completion of the training session so I'm getting 20+ combat dummys all on top of each other after awhile.City of Melnibone - PW
ausnwn2.dyndns.org:5121 _________________________ City of Melnibone
ausnwn.dyndns.org:5121
Posted by MorganQuickthrust at 2004-03-09 12:21:17 Voted 8.00 on 03/09/04