forums | blogs | polls | tutorials | downloads | rules | help

Add new comment

may try a variation of that in alpha 6, will need to create some 64x64 sized party icons for the wolves

bare_elf wrote:
Checked all the pack mule sellers in KoE, LoA, LoU, and several other maps. Just the standard pack animal no Wolves. What about instead of having to modify the sellers make the pack wolf a spell along the lines of the Mod SNPC_LoA where the spell adds the the summoned person to your party. As an example here is Ulora's template

[t:template,n:spell_summon_ulora]
{
	category_name = "magic";
	doc = "spell summon ulora";
	specializes = base_summon_good;
	[aspect]
	{
		gold_value = 200;
	}
	[common]
	{
		screen_name = "Summon Ulora";
		description = "Summons Ulora to join the party.";
		[template_triggers]
		{
			[*]
			{
				action* = call_sfx_script( "nature_spell_sparkle" );
				condition* = receive_world_message("we_dropped");
			}
		}
	}
	[gui]
	{
		active_icon = 	 b_gui_ig_i_ic_sp_asnpc;
		inventory_icon = b_gui_ig_i_ic_sp_asnpc_inv;
	}
	[magic]
	{
		apply_enchantments = false;
		cast_range = 10;
		cast_reload_delay = 1;
		is_one_shot = true;
		mana_cost = 0;
		mana_cost_modifier = (#magic+1)*14-.7;
		max_level = 3;
		required_level = 2;
		requires_line_of_sight = true;
		speed_bias = 1;
		target_type_flags = tt_terrain | tt_not_actor;
		usage_context_flags = uc_passive;

		[enchantments]
		{
		}

	}
	[spell_summon_npc]
	{
		effect_script = "summon";
		end_script = "un_summon";
		template_name = ulora;
	}
}

Here is the skrit file associated with the mod
//////////////////////////////////////////////////////////////////////////////
//
// File     :  spell_summon.skrit
// Author(s):  Rick Saenz, Eric Tams
//
// Copyright © 2000 Gas Powered Games, Inc.  All rights reserved.
//----------------------------------------------------------------------------
//  $Revision:: $              $Date:$
//----------------------------------------------------------------------------
//
// Summons an actor to guard the caster.
//
//////////////////////////////////////////////////////////////////////////////

/*
  summon_npc.dsres v1.0 by Foolius

  Basically stripped out all the stuff about duration and changing
  the state of the caster limiting summons, so the spell can be used
  to assemble a full party of eight (actually unlimited).
  Took out apply enchantments code - the summoned npc has only the
  stats in its own template.
  Took out experience benefactor code.
  Took out state ControlSummoned$.
  Took out delete_inv$ (bool true).
*/


property string effect_script$    = ""  doc = "Name of the SiegeFx script that will be providing the visual.";
property string end_script$      = ""  doc = "Name of the SiegeFx script that will be providing the visual when un_summoning.";
property string script_params$    = ""     doc = "Parameters to send to SiegeFx script";
property string template_name$    = ""     doc = "Template name of actor to summon";
property string state_name$      = "summoned"      doc = "Name of effect to use as a generic state and as a screen name.";
property bool  change_align$    = true  doc = "set summon alignment to be that of the caster.";



owner = GoSkritComponent;
#include "k_inc_spl_utils"

int starting_pos$;

Goid summoned_goid$;
Goid target$;
Goid caster$;
bool frozen$ = false;
float summon_duration$;

trigger OnGoPreload$
{
  if( template_name$ != "")
  {
    GoDb.PreloadCloneSource( owner.Go, template_name$ );
  }
}

trigger OnTimer$( 2 )
{
  SetState CleanUp$;
}


trigger OnGoHandleMessage$( WE_WORLD_STATE_TRANSITION_DONE )
{
  if( summoned_goid$.IsValid )
  {
    if( WorldState.CurrentState == WS_SP_NIS )
    {
      Go Summon$ = summoned_goid$.Go;
      Summon$.Mind.SetMayAttack( false );
      Summon$.Mind.SetMayBeAttacked( false );
      Summon$.Mind.SDoJob( MakeJobReq( JAT_STOP, JQ_ACTION, QP_CLEAR, AO_COMMAND ));

      Summon$.Mind.TempGopColl1.clear;
      Summon$.Mind.GetEngagedMeEnemies( Summon$.Mind.TempGopColl1 );

      int j$ = 0;
      int jend$ = Summon$.Mind.TempGopColl1.Size();

      Go Enemy$;

      while( j$ < jend$ )
      {
        Enemy$ = Summon$.Mind.TempGopColl1.Get( j$ );
        if( Enemy$ != NULL )
        {
          Enemy$.Mind.SDoJob( MakeJobReq( JAT_STOP, JQ_ACTION, QP_CLEAR, AO_COMMAND ));
          Enemy$.Mind.ResetSensors();

        }
        j$ += 1;
      }
    }
    else
    {
      summoned_goid$.Go.Mind.SetMayAttack( true );
      summoned_goid$.Go.Mind.SetMayBeAttacked( true );
    }
  }
}

startup state CastBegin$
{
   event OnGoHandleMessage$( eWorldEvent e$, WorldMessage msg$ )
  {
    if( e$ == WE_REQ_CAST )
    {

      ////////////////////
      // Normal Go

      caster$ = msg$.GetSendFrom();
      target$ = MakeGoid( msg$.GetData1() );

      if( !target$.IsValidMp || !caster$.IsValidMp )
      {
        SetState Abort$;
        return;
      }

      if( caster$.Go.Actor.HasGenericState( owner.Go.Magic.CasterStateName ) )
      {
        SetState Abort$;
        return;
      }

      // Copy the reference to the starting position into SiegeFx persistant storage
      starting_pos$ = SiegeFx.AddVariable( target$.go.placement.position, owner.goid );

      // Start the visual effect
      SiegeFx.SRunScript( effect_script$, target$, caster$, script_params$, owner.Goid, WE_REQ_CAST );


    }
    else if ( e$ == WE_SPELL_SYNC_MID )
    {
      ////////////////////
      // Normal Go

      SetState SummonGo$;
    }
    else if ( e$ == WE_REQ_ACTIVATE )
    {
      ////////////////////
      // Omni Go

      caster$ = msg$.GetSendFrom();
      summoned_goid$ = MakeGoid( msg$.GetData1() );

      if( !summoned_goid$.IsValid || !caster$.Isvalid )
      {
        SetState CleanUp$;
        return;
      }

      if( summoned_goid$.go.hasactor )
      {

        summoned_goid$.Go.Aspect.IsInvincible = false;


        // watch out pet, so if he dies we can control a new pet.

          caster$.Go.OwningParty.Party.AddMemberNow( summoned_goid$.Go );

        GoDb.StartWatching( owner.Goid, summoned_goid$);
       }
       else
       {
         SetState CleanUp$;
       }

      this.CreateTimer( 1, 0 );
    }
  }

}

state SummonGo$
{
  ////////////////////
  // Normal Go

  event OnEnterState$
  {
    if( Owner.go.Parent != NULL )
    {
      // First create the go
      GoCloneReq cloneReq$ = MakeGoCloneReq( template_name$ );
      cloneReq$.StartingPos = SiegeFx.GetVariable( starting_pos$, owner.goid );
      cloneReq$.SnapToTerrain = true;
      cloneReq$.Fadein = true;
      summoned_goid$ = GoDb.SCloneGo( cloneReq$ );

      if( change_align$ && caster$.IsValid )
      {
        summoned_goid$.Go.actor.ssetalignment( caster$.Go.actor.alignment );
        summoned_goid$.Go.SsetPlayer( caster$.Go.PlayerID );
      }
      summoned_goid$.Go.Aspect.IsInvincible = true;

      // create Omni version of the spell.
      cloneReq$ = MakeGoCloneReq( Owner.go.Parent.Goid, owner.goid );
      cloneReq$.Omni = true;
      Goid new_spell$ = GoDb.SCloneGo( cloneReq$ );

      // send Omni version an Activate to get it started.
      PostWorldMessage( WE_REQ_ACTIVATE, caster$, new_spell$, MakeInt( summoned_goid$ ), 0 );
    }
    // delete normal version of the spell.
    SetState Finished$;
  }
}



state Finished$
{
  ////////////////////
  // Normal Go

  event OnEnterState$
  {
    PostWorldMessage( WE_REQ_DELETE, owner.Goid, owner.Goid, 1 );
  }
}

state FinishedOmni$
{
  ////////////////////
  // Omni Go

  event OnEnterState$
  {
    // Get rid of any temporary storage
    SiegeFx.ClearVariables( owner.goid );

    PostWorldMessage( WE_REQ_DELETE, owner.Goid, owner.Goid, 1 );
  }
}

state Abort$
{
  ////////////////////
  // Normal Go

  event OnEnterState$
  {
    // Refund the players mana
    Rules.ChangeMana( caster$, owner.go.getmagic.manacost );

    // Get rid of any temporary storage
    SiegeFx.ClearVariables( owner.goid );

    PostWorldMessage( WE_REQ_DELETE, owner.Goid, owner.Goid, 1 );
  }
}

If you do not have the mod DE and if it is not on the site, let me know and I can upload the whole thing.

Elf