///////////////////////////////////////////////////////////////////////////// // // File : weapon_knockback.skrit // Author(s): Witness (Lisa Hui) // Purpose : pushes back a successfully hit target // // Version : v1.1 [August 30, 2004] // - altered event handling to piggyback weapon_notify_melee // // v1.0 [August 27, 2004] // //---------------------------------------------------------------------------- // Version: 1.1 Date: August 30, 2004 //---------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////// property string _required_component$ = "weapon_attack_notify_melee"; property float stun_duration$ = 1.0 doc = "Seconds to wait before recovering from knockback stun"; property string stun_effect_script$ = "knockback_stun" doc = ""; property string stun_effect_params$ = "" doc = ""; property float drift_speed$ = 9.0 doc = ""; property float drift_distance_min$ = 2.0 doc = ""; property float drift_distance_max$ = 2.5 doc = ""; property string drift_effect_script$ = "knockback_drift" doc = ""; property string drift_effect_params$ = "" doc = ""; property float chance$ = 1.0 doc = "chance to trigger a knockback effect"; property string immunity$ = "immune_freeze" doc = "does not work on targets with this immunity membership"; property eWorldEvent msg_hit_begin$ = WE_REQ_ACTIVATE doc = ""; property eWorldEvent msg_hit$ = WE_REQ_CAST doc = ""; property eWorldEvent msg_hit_end$ = WE_REQ_DEACTIVATE doc = ""; owner = GoSkritComponent; ////////////////////////////////////////////////////////////////////////////// // GLOBALS ////////////////////////////////////////////////////////////////////////////// Goid wielder$, target$; ////////////////////////////////////////////////////////////////////////////// // STATES ////////////////////////////////////////////////////////////////////////////// startup State Wait$ { //event OnEnterState$ { // report.screen("weapon_backstab - OnEnterState$ - Wait$"); //} event OnGoHandleMessage$( eWorldEvent e$, WorldMessage msg$ ) { if ( e$ == msg_hit_begin$ ) { wielder$ = msg$.GetSendFrom(); target$ = wielder$.Go.Mind.EngagedObject; if ( !wielder$.IsValid || !target$.IsValid ) { return; } SetState Attack$; } } } State Attack$ { event OnGoHandleMessage$( eWorldEvent e$, WorldMessage ) { if ( e$ == msg_hit$ ) { if ( !wielder$.IsValid || !target$.IsValid ) { //report.screenf("weapon_knockback - hit invalidated"); SetState Wait$; return; } if ( immunity$ != "" ) { if ( target$.Go.Common.Membership.Contains( immunity$ ) ) { target$ = Goid.InvalidGoid; return; } } if ( GoMath.RandomFloat( 1.0 ) > chance$ ) { //chance failed return; } if ( target$.Go.HasMind() ) { Goid manager$; if ( !target$.Go.Actor.HasGenericState( "knockback" ) ) { GoCloneReq req$ = MakeGoCloneReq( Owner.Go.Parent.Goid, "knockback_manager" ); req$.Omni = true; manager$ = GoDb.SCloneGo( req$ ); } else { manager$ = target$.Go.Actor.GetGenericStateSpellGoid( "knockback" ); if ( !manager$.IsValid ) { //something went wrong... GoCloneReq req$ = MakeGoCloneReq( owner.Go.Parent.Goid, "knockback_manager" ); req$.Omni = true; manager$ = GoDb.SCloneGo( req$ ); target$.Go.Actor.SRemoveGenericState( "knockback" ); } } manager$.Go.SetComponentFloat( "knockback_manager", "stun_duration", stun_duration$ ); manager$.Go.SetComponentString( "knockback_manager", "stun_effect_script", stun_effect_script$ ); manager$.Go.SetComponentString( "knockback_manager", "stun_effect_params", stun_effect_params$ ); manager$.Go.SetComponentFloat( "knockback_manager", "drift_speed", drift_speed$ ); manager$.Go.SetComponentFloat( "knockback_manager", "drift_distance_min", drift_distance_min$ ); manager$.Go.SetComponentFloat( "knockback_manager", "drift_distance_max", drift_distance_max$ ); manager$.Go.SetComponentString( "knockback_manager", "drift_effect_script", drift_effect_script$ ); manager$.Go.SetComponentString( "knockback_manager", "drift_effect_params", drift_effect_params$ ); PostWorldMessage( WE_REQ_ACTIVATE, wielder$, manager$, MakeInt( target$ ), 0.0 ); } } else if ( e$ == msg_hit_end$ ) { SetState Wait$; } } }