Legacy:Sparrow - Unreal Wiki

# Legacy:Sparrow

### From Unreal Wiki, The Unreal Engine Documentation Site

boop.

## Summon Creature Code for UT (not working).

#### In weapon class :

    //=============================================================================
    // WizardKatana.
    //=============================================================================
    class WizardKatana extends TournamentWeapon;

    simulated exec function NextCategory() {
      if (Pawn(Owner).PlayerReplicationInfo.Isa('SDPlayerInfo')){
        SDPlayerInfo(PlayerPawn(Owner).PlayerReplicationInfo).NextCategory();
      }
    }

    simulated exec function NextCreature() {
      if (Pawn(Owner).PlayerReplicationInfo.Isa('SDPlayerInfo')){
        SDPlayerInfo(PlayerPawn(Owner).PlayerReplicationInfo).NextCreature();
      }
    }

    simulated exec function SDSummon() {
      if (Pawn(Owner).PlayerReplicationInfo.Isa('SDPlayerInfo')){
        SDPlayerInfo(PlayerPawn(Owner).PlayerReplicationInfo).SDSummon();
      }
    }

    //replication {
    //  reliable if ( Role == ROLE_Authority )
    //    UpdateCatInfo,UpdateCreatureInfo,NextCategory,PreviousCategory,
    //    NextCreature,PreviousCreature,SDSummon;
    //}

    defaultproperties{
       PickupMessage="You have found a Wizard Katana."
       ItemName="Wizard Katana"
    }

#### In SDPlayerInfo

    //=============================================================================
    // SDPlayerInfo
    //=============================================================================
    class SDPlayerInfo extends PlayerReplicationInfo;

    var() string CreatureCategory[6];

    // ugly code to manage summons
    var bool                AmCasting;       //set to false soon as creature is summoned
    var int                 MaxCreature;     // Array count of current CreatureCategory
    var() int               MaxInCat[6];        // Array of Array counts, for MaxCreature

    // what's selected. This info should display in the HUD
    var travel int          CurrentSpell;    //Summon spell is always avalible, through key bindings
    var travel int          CurrentCategory; //Category of creatures which can be summoned
    var travel int               CurrentCreature; //Creature that will be summoned when summon spell is called

    simulated function NextCategory() {
      if (CurrentCategory < (ArrayCount(CreatureCategory)-1)) {
        CurrentCategory++;
      } else {
        CurrentCategory = 0;
      }
      MaxCreature = MaxInCat[CurrentCategory];
      CurrentCreature = 0;
    }

    simulated function NextCreature() {
      if (CurrentCreature < MaxCreature) {
        CurrentCreature++;
      } else {
        CurrentCreature = 0;
      }
    }

    simulated function SDSummon() {
      AmCasting = true;
    }

    replication{
            // Things the server should send to the client.
            reliable if ( Role == ROLE_Authority )
         NextCategory,NextCreature,PreviousCreature,PreviousCategory;
    //     CurrentSpell,
    //     CastingCreature,
    //     CurrentCategory,
    //     CurrentCreature,
    //     AmCasting;
    }

    replication{
            // Things the client should send to the server.
        unreliable if (Role == ROLE_Authority )
    //    reliable if ( RemoteRole == ROLE_None ||            // Covering all the bases
    //                 RemoteRole == ROLE_DumbProxy ||
    //                 RemoteRole == ROLE_SimulatedProxy ||
    //                 RemoteRole == ROLE_AutonomousProxy || // all player pawns are supposed to have ROLE_AutonomousProxy
    //                 Role == ROLE_Authority
    //                  )
         CurrentSpell,  //CastingCreature,
         CurrentCategory,
         AmCasting,
         CurrentCreature, CurrentUtility;
    }

    defaultproperties{
      CreatureCategory(0)="Fly"
      MaxInCat(0)=5
      CreatureCategory(1)="Manta"
      MaxInCat(1)=3
      CreatureCategory(2)="Fish"
      MaxInCat(2)=5
      CreatureCategory(3)="Animal"
      MaxInCat(3)=4
      CreatureCategory(4)="Spider"
      MaxInCat(4)=3
      CreatureCategory(5)="Clone"
      MaxInCat(5)=2

      AmCasting=false
      MaxCreature=5

      CurrentSpell=0
      CurrentCategory=0
      CurrentCreature=0
    }

#### In GameInfo

    //=============================================================================
    // LastSummonerStanding.
    //=============================================================================
    class LastSummonerStanding extends LastManStanding;

    var int MaxSpellLevel;

    var() string Fly[5];
    var() string Manta[3];
    var() string Fish[5];
    var() string Animal[4];
    var() string Clone[2];
    var() string Spider[3];

    function tick (float dt){
      local PlayerPawn NewPawn;
      local Bot NewBot;
      local bool AmCasting;
      local int CurrentCategory, CurrentCreature;
      local SDPlayerInfo PlayerInfo;
      local SDBotInfo BotInfo;

      Super.Tick(dt);

      //yes... I know this is ugly. But dunno how else to do it.
      foreach AllActors (Class'Engine.PlayerPawn', NewPawn) {
        if (NewPawn != None){
          AmCasting = false;
          CurrentCategory = 0;
          CurrentCreature = 0;
          if (NewPawn.PlayerReplicationInfo.Isa('SDPlayerInfo')){
            PlayerInfo = SDPlayerInfo(NewPawn.PlayerReplicationInfo);
            CurrentCreature = PlayerInfo.CurrentCreature;
            CurrentCategory = PlayerInfo.CurrentCategory;
            AmCasting = PlayerInfo.AmCasting;
            PlayerInfo.AmCasting = false;
            if (AmCasting){
              NewPawn.ClientMessage("Current Creature is "$string(CurrentCreature)); // these lines return
              NewPawn.ClientMessage("Current Category is "$string(CurrentCategory)); // the wrong values
              SDMSummon(NewPawn,CurrentCategory, CurrentCreature);
            }
          }
        }
      }
      foreach AllActors (Class'Botpack.Bot', NewBot) {
        if (NewBot != None){
          AmCasting = false;
          CurrentCategory = 0;
          CurrentCreature = 0;
          if (NewBot.PlayerReplicationInfo.Isa('SDBotInfo')){
            NewBot.ClientMessage("I think you're a bot");
            CurrentCategory = SDBotInfo(NewBot.PlayerReplicationInfo).CurrentCategory;
            CurrentCreature = GetCurrentCreature(CurrentCategory);
            AmCasting = SDBotInfo(NewBot.PlayerReplicationInfo).AmCasting;
            SDBotInfo(NewBot.PlayerReplicationInfo).AmCasting = false;
            if (AmCasting){
              SDMSummon(NewBot,CurrentCategory, CurrentCreature);
            }
          } // end if bot info
        } // end sure bot
      } // end loop
    } // end function

    simulated function string GetCastingCreature(int CurrentCategory, int CurrentCreature){
      local string CastingCreature;
      CastingCreature = "None";
      if(CurrentCategory==0) {
        CastingCreature = Fly[CurrentCreature];
      }else if (CurrentCategory==1){
        CastingCreature = Manta[CurrentCreature];
      }else if (CurrentCategory==2){
        CastingCreature = Fish[CurrentCreature];
      }else if (CurrentCategory==3){
        CastingCreature= Animal[CurrentCreature];
      }else if (CurrentCategory==4){
        CastingCreature = Spider[CurrentCreature];
      }else if (CurrentCategory==5){
        CastingCreature = Clone[CurrentCreature];
      }
      return CastingCreature;
    }

    simulated function bool SDMSummon(Pawn Owner, int pCatID, int CurrentCreature){
       local class<actor> NewClass;
       local int LCreatureCount;
       local ScriptedPawn NewCreature;
       local vector NewVector;
       local Actor NewPawn;
       local string ClassName;

       ClassName = GetCastingCreature(pCatID,CurrentCreature);

       LCreatureCount = 0;
       foreach AllActors (Class 'UnrealShare.ScriptedPawn', NewCreature) {
         if (NewCreature.Owner == Owner) {
           LCreatureCount+=1;
         }
       }
       if(LCreatureCount > SDPlayerInfo(PlayerPawn(Owner).PlayerReplicationInfo).MaxSummons) {
         Owner.ClientMessage("You have too many creatures still in play to summon more.");
       }else{
         NewClass = class<actor>( DynamicLoadObject(ClassName, class'Class' ));
         if( NewClass!=None ) {
         NewVector = (Owner.Velocity*0.5)+(Owner.Location + 110 * Vector(Owner.Rotation) + vect(0,0,1) * 25);
         Spawn(class'WeaponLight',,'',NewVector);
         NewPawn = Spawn( NewClass,Owner,,NewVector,Owner.Rotation);

         if (NewPawn != None){
              SDPlayerInfo(PlayerPawn(Owner).PlayerReplicationInfo).CreatureCount[pCatID]++;
              Spawn(class'PawnTeleportEffect',,'',NewVector);
              Owner.PlaySound(Sound'U4eTM.zapper.zapcharge', SLOT_Misc, 4 * Owner.SoundDampening);
              return true;
            }else{
              Owner.ClientMessage("Summon Spell Failed");
              return false;
            }
         }else{
           Owner.ClientMessage("Dunno what a '"$ClassName$"' is.");
           return false;
         }
       }
    }

    defaultproperties{
      Fly(0)="SDCreatures.Gnat"
      Fly(1)="SDCreatures.SmallFly"
      Fly(2)="SDCreatures.GnatQueen"
      Fly(3)="SDCreatures.StandardFly"
      Fly(4)="SDCreatures.GiantFly"

      Manta(0)="SDCreatures.SmallManta"
      Manta(1)="SDCreatures.StandardManta"
      Manta(2)="SDCreatures.BossManta"

      Fish(0)="SDCreatures.BittyFish"
      Fish(1)="SDCreatures.SmallFish"
      Fish(2)="UnrealShare.DevilFish"
      Fish(3)="UnrealI.Squid"
      Fish(4)="SDCreatures.KillerFish"

      Animal(0)="SDCreatures.RabidRabbit"
      Animal(1)="UnrealShare.BabyCow"
      Animal(2)="UnrealShare.Cow"
      Animal(3)="UnrealShare.Bird1"

      Spider(0)="SDCreatures.TarantulaSpider"
      Spider(1)="SDCreatures.JumperSpider"
      Spider(2)="SDCreatures.SpitterSpider"

      Clone(0)="SDCreatures.Decoy"
      Clone(1)="SDCreatures.Clone"

         MaxSpellLevel=5
         bUseTranslocator=False
         bCanViewOthers=False
         bCanChangeSkin=true
         FragLimit=50
         TimeLimit=0
         bAlwaysForceRespawn=True
         bNoMonsters=False
         StartUpMessage="Last Summoner Standing.  How long can you live?"
         gamegoal="lives to try and keep"
         HackedMessage=" was hacked"
         ScoreBoardType=Class'Botpack.LMSScoreboard'
    //     ScoreBoardType=Class'SDMods.LSSScoreBoard'
         RulesMenuType="UTMenu.UTLMSRulesSC"
    //     RulesMenuType="SDMods.SDRulesClient"
         BeaconName="LSS"
    //     BeaconName="LMS"
         HUDType=Class'SDMods.SDHud'
         GameName="Last Summoner Standing"
    //     GameReplicationInfoClass=Class'SDMods.SDGameReplicationInfo'

    }

#### Problem

     Even though category has changed in the player info, it always returns the default values in tick.

#### Description from IRC

in the "tick" function of LastSummonerStanding

I can't get it to see the actual CurrentCategory

or creature

at every point before that, if I put in a "My current value is" message, it seems to work fine

and it works fine in the HUD

which is very simplistic at this point

#### Reason summon is in Tick

Before it was in one of the above classes. The creatures would summon (and the right ones), but they were local copies that couldn't be seen across the network. Also, if the summoner walked through them, then they exploded. Which was funny, but not the desired effect.

#### Notes

Making the functions in the game info class simulated or not, doesn't seem to make a difference.

I don't think they should be at that point. I've tried making all functions above simulated, or not simulated, to no effect.

##### Views

- Legacy
- Discussion
- Current revision

##### Search