分类目录归档:ArgBox

ArgBox-常用默认参数

    事件默认参数

    1. 事件执行时,有一些默认储存的参数,常用的默认参数有:
    参数Key参数Key
    RoleTaiwu事件盒子中太吾的固定key
    TaiwuCharacterId太吾角色id,始终获取当前太吾的角色Id
    TaiwuAreaId太吾所在区域id,始终获取太吾当前所在区域的Id
    TaiwuBlockId太吾所在地块索引,始终获取太吾当前所在地块的BlockId
    TaiwuVillageAreaId太吾村所在区域id
    TaiwuVillageBlockId太吾村所在地块索引
    ForbidViewCharacter是否禁止查看目标人物标记位
    HideFavorability是否隐藏目标人物好感度显示
    MainRoleUseAlternativeName做选择的角色名字显示是否使用代称
    TargetRoleUseAlternativeName目标交谈角色名字显示是否使用代称
    常用的默认参数
    1. 调用方法皆为EventArgBox.Key
    2. 这些Key有部分是只读的,可读取其参数值以供事件使用:
      RoleTaiwuTaiwuCharacterIdTaiwuAreaIdTaiwuBlockIdTaiwuVillageAreaIdTaiwuVillageBlockId,示例如下:
    //常用的,调用太吾的角色数据
        var taiwu=ArgBox.GetCharacter(EventArgBox.RoleTaiwu);
        //获取太吾村位置,因为Location可以通过地区和地块ID进行定义,可以通过默认储存的地区ID和地块ID获取位置
    Location villageLocation=new Location
    (EventArgBox.TaiwuVillageAreaId,EventArgBox.TaiwuVillageBlockId);

    即通过调用,便可使用其对应的参数值。

    1. 有部分是可以设置的,通过设定其值(通常是true/false),达到具体效果,
      ForbidViewCharacterHideFavorability示例如下:
    ArgBox.Set(EventArgBox.ForbidViewCharacter, true);//禁止查看目标人物ArgBox.Set(EventArgBox.HideFavorability, true);//不显示目标人物好感

    通过设置其值为true/false,则可控制当事件窗口右侧人物显示时,是否可以点击人物查看属性,是否显示人物对太吾的好感等。
    这些值如不设定,会有默认状态通常为false),通常情况下无须改变。当有特殊制作需要时,方将其改变为true。

      特殊传入参数

      1. 除了事件默认参数外,当事件接入其他系统时,也会特殊地传入一些相关参数以供使用。
      触发点类型参数类型参数盒子调用key参数描述
      太吾进行了一次地格移动LocationBlockFrom
      BlockTo
      原本所在地块
      当前到达地块
      用户点击角色头像进行交互intCharacterId被点击的角色的id
      战斗开始intCharacterId敌方的角色id
      产业系统中点击门派特色建筑shortTemplateId建筑的TemplateId
      用户点击动物头像进行交互shortTemplateId动物的TemplateId
      用户点击紫竹化身进行交互intCharacterId被点击的角色的id
      特殊传入参数
      1. 使用范例·一(以与一个角色交互为例):
        》》首先将事件类型设为“用户点击角色头像进行交互” ;
      触发类型-角色交互

      》》设置之后,参数盒子中便自然会存入默认参数“CharacterId”;
      》》结合事件参数盒子中默认储存的太吾参数(RoleTaiwu,根据需要将其填入“决策角色”与“目标角色”中;

      决策角色与目标角色

      》》填写需要的事件内容及选项(此处略);
      》》最终展示出的事件界面便是左边显示太吾立绘,右边显示被点击的角色立绘的效果:

      决策角色与目标角色效果示例

      》》如果需要对相应的角色进行处理,则可通过方法获取其角色,并对他执行相应的处理。

      1. 使用范例·二(以进行一次地格移动为例,目标:移动到太吾村时触发事件
        》》首先将想要触发的事件类型设为“太吾进行了一次地格移动”;
      触发类型-地格移动

      》》设置之后,太吾每进行一次移动,事件系统都会检定一次该事件是否应该发生,并且默认拥有原本所在地块BlockFrom)、移动后地块BlockTo)的数据;
      》》在事件代码OnCheckEventCondition()对移动后地块的数据(通过调用EventArgKeys.BlockTo)进行检测,当移动后的位置与太吾村位置相等时,则返回true触发事件

      public override bool OnCheckEventCondition()
      {
              if(ArgBox.Get(EventArgKeys.BlockTo,out Location location))//获取移动后的地格位置
              {
                  Location villageLocation=new Location(EventArgBox.TaiwuVillageAreaId,EventArgBox.TaiwuVillageBlockId);//获取太吾村的位置
                  if(location==villageLocation)//如果移动后的位置为太吾村位置
                      return true;//事件触发
              }        
          return false;//默认不触发
      }

      》》填写需要的事件内容及选项(此处略);
      》》最终效果为到达太吾村时触发事件;

      到达太吾村
      1. 其他参数调用,亦可参考如上类似方法。

        战斗后传入参数

        1. 在事件中发生战斗后,战斗系统会传入一些必要的参数以供后续事件调用;
        Key类型说明
        EventArgBox.CharIdSeizedInCombatint战斗中用绳索绑到的人物Id,可能为null
        EventArgBox.CarrierItemKeyGotInCombatItemKey战斗中用绳索绑到的动物转化为坐骑后的ItemKey
        “CombatResult”int战斗结果
        “CombatType”sbyte战斗类型
        “MainEnemyId”int战斗中主战者角色Id
        战斗参数
        1. 通过正常的参数调用方法,可以获取其值,并决定后续处理;
        2. 使用范例(以常用的战斗结果为例,根据不同的战斗结果跳转到不同事件):
         if(ArgBox.Get("CombatResult",ref combatResult))
                    {
                        if(combatResult == CombatResultType.EnemyDie)
                        {//TODO 己方胜利处决               
                             EventHelper.ToEvent(A事件Guid);
                        }
                        else if(combatResult == CombatResultType.PlayerWin)
                        {//TODO 己方胜利未处决
                             EventHelper.ToEvent(B事件Guid);
                        }
                        else if(combatResult == CombatResultType.EnemyWin)
                        {//TODO 敌方胜利未处决
                             EventHelper.ToEvent(C事件Guid);
                        }
                        else if(combatResult == CombatResultType.PlayerDie)
                        {//TODO 敌方胜利处决
                             EventHelper.ToEvent(D事件Guid);
                        }
                        else if(combatResult == CombatResultType.PlayerFlee)
                        {//TODO 我方逃跑
                             EventHelper.ToEvent(E事件Guid);
                        }
                        else if(combatResult == CombatResultType.EnemyFlee)
                        {//TODO 敌方逃跑
                             EventHelper.ToEvent(F事件Guid);
                        }
                    }

        备注:ToEvent部分代码,在事件触发类型为“太吾进行一次地格移动”时,尽量不要填写在OnEventEnter()中,且跳转之后要即时return,若不这么做,将可能造成地图系统监听事件失败而卡顿。

        1. 如代码示例,当战斗结果为敌方胜利,且敌人并未在战斗中处决我方时,则对应CombatResultType.EnemyWin结果,事件将跳转到C事件。

        ArgBox-简介

        • ArgBox为变量盒子,用于储存一个事件链中的变量。(事件链:从首事件开始,会不断地执行前往下一级事件,直到事件结束。)
        • ArgBox的使用,可以写在任意需要的位置,通常写在这些接口内部:

                  编辑事件代码-OnEventEnter()、OnEventExit()

                  编辑选项代码-OnVisibleCheck()、OnAvailableCheck()、OnSelect()

                  如:

        public override void OnEventEnter()
        {
            	ArgBox.Set("SaveArg0", 1);
        }

        ArgBox-常用操作

          变量储存

          1. 通过将变量储存进ArgBox,该变量可在后续事件链中再通过ArgBox被调用
          2. 写法格式为ArgBox.Set(参数名,值),示例如下:
          //向ArgBox中储存一个int类型值
              int rd = 5;
              ArgBox.Set("SaveArg0", rd);
          
              //向ArgBox中储存一个bool类型值
              bool haveFixed = true;
              ArgBox.Set("SaveArg1", haveFixed);
          
              //向ArgBox中储存一个string类型值
              string interactWord = "HelloWorld";
              ArgBox.Set("SaveArg2", interactWord);
          
              //向ArgBox中储存一个Location(位置)
              var taiwu = ArgBox.GetCharacter(EventArgBox.RoleTaiwu);//辅助代码:该句为获取太吾的Character,用于获取太吾所在位置,实际储存中,可以使用任意有效语句
              Location taiwuLocation = taiwu.GetLocation();//辅助代码:该句为获取太吾所在位置,实际储存中,可以使用任意有效语句
              ArgBox.Set("SaveArg3", taiwuLocation);
          
              //向ArgBox中储存一个ItemKey(道具实例)
              ItemKey itemkey= EventHelper.AddItemToRole(taiwu,ItemType.Material,Config.Material.DefKey.PoisonIllusory7,1);//辅助代码:该句为向太吾背包中添加指定类型、指定id的道具“人面曼陀罗”,同时获取其道具实例的数据,实际储存中,可以使用任意有效语句
              ArgBox.Set("SaveArg4", itemkey);
              
              //向ArgBox中储存一个CharacterId(人物Id)
              int enemyId=1;//辅助代码:指定角色id为1 
              ArgBox.Set("Enemy", enemyId);
          1. 因为人物、物品、地点的获取通常需要调用额外方法,以下对此做额外介绍:

          》》常用的调用人物方法
          >> 默认储存的人物数据,请查看“ArgBox常用默认参数-2.特殊传入参数”;
          >> 根据模板随机生成非智能角色(注:非智能角色在事件结束后将会被删除,不会实际生
          成存档角色,此方法可避免生成过多的垃圾数据)
          示例:

          int  enemyId = EventHelper.CreateNonIntelligentCharacter(Config.Character.DefKey.SnakeBeggar);
              ArgBox.Set("EnemyId", enemyId);

          通过CreateNonIntelligentCharacter方法,填入对应角色的DefKey,则可以生成一
          智能角色,同时可以获取其Id存入参数盒子。
          >> 创建真实智能角色(注:该方法每次被调用,都会生成一个真实存在的npc,一定
          谨慎使用)
          示例:

          Location location = ArgBox.GetCharacter(EventArgBox.RoleTaiwu).GetLocation();
          var SectCharacter=EventHelper.CreateIntelligentCharacter(location,Gender.Male,25,750,EventHelper.GetSettlementIdByOrgTemplateId(Config.Organization.DefKey.Shaolin),5);
                  ArgBox.Set("CharacterA",SectCharacter.GetId());

          该方法需要的参数有:人物生成的位置参数1),人物性别参数2),年龄参数
          3),魅力参数4),所属团体的TemplateId参数5),角色品级参数6)。
          最终将生成一个少林派的25岁男性阶级5的弟子,其魅力750
          >> 获取或生成固定角色(注:固定角色主要是一些主线npc,拥有特有的属性特性等)
          示例:

          int charId = EventHelper.GetOrCreateFixedCharacterByTemplateId(Config.Character.DefKey.OldWomanFeng).GetId();
              ArgBox.Set("Fengoldwoman",charId);

          通过GetOrCreateFixedCharacterByTemplateId方法,填入对应角色的DefKey
          则可以生成一个固定角色如果该固定角色曾被创建出来,则获取其Id),同时可以获
          取其Id存入参数盒子。
          >> 创建临时的智能角色,方法为CreateTemporaryIntelligentCharacter,所需参数
          创建真实智能角色一致;
          >> 获取指定地块的人物列表
          注意!!!本方法使用时需要提前在事件代码的OnEventEnter()中引用如下对应名称
          间:

          #region CustomUsings
          using GameData.Domains;
          #endregion
          

          其后,在需要检测地格人物列表的位置,先获取位置,再获取地格信息,通过地格信息
          中的相关信息得到人物列表,示例如下(获取地格的角色Id列表):

          var location = ArgBox.GetCharacter(EventArgBox.RoleTaiwu).GetLocation();
          var blockData = GameData.Domains.DomainManager.Map.GetBlock(location);
          HashSet<int> characterSet=blockData.CharacterSet;
          

          此处示例为获取太吾所在位置的角色Id列表
          之后,如果检测该列表不为空,便可对其中的Id进行遍历操作,直到找出自己想要的人
          物,示例如下:

          if(characterSet == null)//如果当前地格没有人,不触发
                  return false;
          

          此处填写在OnEventCondition()中,意为当地格无人,事件触发,如果填写在其
          他位置,也当有设计好的处理

          foreach(var charId in characterSet)
              {
                  if(EventHelper.GetCharacterById(charId)!=null)
                  {
                      var cellChar=EventHelper.GetCharacterById(charId);
                      OrganizationInfo orgInfo=cellChar.GetOrganizationInfo();
                      if(EventHelper.IsInAnySect(charId)&&orgInfo.Grade==Grade.Highest&&orgInfo.Principal)
                      {
                          ArgBox.Set("Principal",charId);
                          return true;
                      }
                  }
              }
          return false;
          

          此处示例为查找列表中是否有门派掌门。如果有,就将其传入参数盒子,如果没有,
          则不触发事件;实际使用中,根据代码填写位置和自己的需求,可以有更多的变体,比
          如通过API文档中的检测关系的相关接口,获取与自己有特定关系的人物;或者获取心
          情等属性达到一定标准的人物,皆是可以操作的。


          >> 通过参数盒子中存储的人物Id获取角色

          var taiwu = ArgBox.GetCharacter(EventArgBox.RoleTaiwu);
          var character = ArgBox.GetCharacter("CharacterId");

          方法中需要的参数为已被储存的Key

          》》常用的调用物品方法:
          >> 添加物品到角色背包(注:该方法在调用的同时,将会创建物品并放入人物背包);
          示例:

          var taiwu = ArgBox.GetCharacter(EventArgBox.RoleTaiwu);
              ItemKey itemkey= EventHelper.AddItemToRole(taiwu,ItemType.Material,Config.Material.DefKey.WoodOuter7,1);

          通过AddItemToRole方法,该方法需要的参数为:角色参数1),此处指定为太吾,
          道具类别参数2),道具Id参数3-可通过DefKey获取),数量参数4)。
          示例中的效果生成乌金紫檀并放入太吾背包。
          >> 添加促织到角色背包:
          示例:

          var taiwu = ArgBox.GetCharacter(EventArgBox.RoleTaiwu);
          ItemKey cricket1= EventHelper.AddCricketToInventory(taiwu,Config.CricketParts.DefKey.White,Config.CricketParts.DefKey.RoundWings);//生成圆翅白

          通过AddCricketToInventory方法,该方法需要的参数为:角色参数1),此处指定
          为太吾,织部件1参数2),指定为白色,促织部件2参数3),指定为圆翅。
          示例中的效果添加圆翅白并放入太吾背包。
          >> 使指定人物获取指定技艺书:
          示例:

          ItemKey bookKey=EventHelper.GetLifeSkillBook(EventArgBox.TaiwuCharacterId,123);

          通过GetLifeSkillBook方法,该方法需要的参数为:角色id参数1),此处直接调用
          参数盒子中默认参数(可查看:ArgBox-常用默认参数),技艺书id参数2)。
          示例中的效果太吾获取id为123的技艺书。
          >> 使指定人物获取指定功法书:
          示例:

          ItemKey bookKey=EventHelper.GetCombatSkillBook(EventArgBox.TaiwuCharacterId,123,1,pageIsDirect,3);

          通过GetCombatSkillBook方法,该方法需要的参数为:角色id参数1),功法书id
          参数2),总纲类型参数3-sbyte),各页是否正练参数4-bool数组,需自行指
          ),完整书页数参数5)。
          示例中的效果太吾获取id是123的功法书,总纲类型为“合”,其中有3页完整,各页正
          逆练需要看提前指定。

          >> 其他常用方法可参考常用规则中道具筛选,获取选中的物品。

          》》常用的调用地点方法:
          >> 获取人物所在的位置

          var taiwu =    ArgBox.GetCharacter(EventArgBox.RoleTaiwu);
              Location location = taiwu.GetLocation();

          首先指定人物,其次通过GetLocation()获取人物当前所处位置。
          >> 通过地区Id地块Id构造一个位置

          Location villageLocation=new Location(EventArgBox.TaiwuVillageAreaId,EventArgBox.TaiwuVillageBlockId);

          参数1地区Id参数2地块Id,此处取用参数盒子中默认储存的太吾村地区ID以及
          太吾村地块ID,则获取到太吾村位置
          >> 在获取地点后,可通过查看Location构造,查看更多使用。

            变量调用

            1. 通过调用ArgBox中已经储存的变量,可以进行相应的操作;
            2. 写法格式为:
              》》ArgBox.Get(参数名, ref 变量);
              示例如下:
            int arg0=-1;
                if(ArgBox.Get("SaveArg0",ref arg0))//如果取到值
                {
                    if(arg0>=5)
                        return 事件A的Guid;
                }
                return 事件B的Guid;

            》》ArgBox.Get(参数名, out 变量类型 变量);
            示例如下:

            //取出之前存储的ItemKey
                ArgBox.Get("SaveArg4", out ItemKey itemkey);
            
                //使用示例:转移道具
                //因为之前储存时该道具已放入玩家角色背包,此处可以直接转移给别人
                var taiwu=ArgBox.GetCharacter(EventArgBox.RoleTaiwu);
                var enemy=ArgBox.GetCharacter("Enemy");
                EventHelper.TransferInventoryOrEquipItem(taiwu,enemy,itemkey);//将太吾背包中的道具转移到别人背包中
            1. 获取参数的同时,会返回一个bool值意为是否取到该值),当参数盒子中不存在该值时,将返回false。
              变量调用-2第一个示例中,如果之前并未储存过”SaveArg0″,则取不到该参数的值,因此if方法体内的所有逻辑都不会被执行

              变量移除

              1. 通过移除ArgBox中已经储存的变量,可使后续事件中不再能取到该变量;
              2. 写法格式为ArgBox.Remove<变量类型>(变量名);
                示例如下:
              ArgBox.Remove<ItemKey>("SaveArg4");