Пример #1
0
    /// <summary>
    /// 创建中立障碍物
    /// </summary>
    /// <param name="vo">数据</param>
    private DisplayOwner CreateNPCObstacle(VOBase vo, CreateActorParam otherParam)
    {
        _npcObstacleDict.Add(vo.ObjID.ID, vo);
        var fixItem = GameObject.CreatePrimitive(PrimitiveType.Cube);
        // 设置父级
        ParentManager.Instance().SetParent(fixItem, ParentManager.ObstacleParent);
        fixItem.layer = LayerMask.NameToLayer("Scenery");
        //fixItem.name += i;
        var fix = fixItem.AddComponent<FixtureData>();
        var unitWidth = ClusterManager.Single.UnitWidth;
        var mapWidth = ClusterManager.Single.MapWidth;
        var mapHeight = ClusterManager.Single.MapHeight;
        var offsetPos = LoadMap.Single.transform.position;
        fix.AllData.MemberData = new VOBase()
        {
            ObjID = new ObjectID(ObjectID.ObjectType.NPCObstacle),
            SpaceSet = 1,
        };
        fix.transform.localScale = new Vector3(unitWidth, unitWidth, unitWidth);
        fix.transform.position = Utils.NumToPosition(offsetPos, new Vector2(otherParam.X, otherParam.Y), unitWidth, mapWidth, mapHeight);
        fix.X = otherParam.X * unitWidth - mapWidth * unitWidth * 0.5f + offsetPos.x;
        fix.Y = otherParam.Y * unitWidth - mapHeight * unitWidth * 0.5f + offsetPos.z;
        fix.Diameter = 1;

        var result = new DisplayOwner(fixItem, fix);

        // 添加至ClusterManager中
        //ClusterManager.Single.Add(fix);

        DisplayerManager.Single.AddElement(vo.ObjID, result);

        return result;
    }
Пример #2
0
    static int CreateSkillInfo(IntPtr L)
    {
        try
        {
            int count = LuaDLL.lua_gettop(L);

            if (count == 3 && TypeChecker.CheckTypes(L, 1, typeof(SkillManager), typeof(int), typeof(int)))
            {
                SkillManager obj  = (SkillManager)ToLua.ToObject(L, 1);
                int          arg0 = (int)LuaDLL.lua_tonumber(L, 2);
                int          arg1 = (int)LuaDLL.lua_tonumber(L, 3);
                SkillInfo    o    = obj.CreateSkillInfo(arg0, arg1);
                ToLua.PushObject(L, o);
                return(1);
            }
            else if (count == 4 && TypeChecker.CheckTypes(L, 1, typeof(SkillManager), typeof(int), typeof(DisplayOwner), typeof(int)))
            {
                SkillManager obj  = (SkillManager)ToLua.ToObject(L, 1);
                int          arg0 = (int)LuaDLL.lua_tonumber(L, 2);
                DisplayOwner arg1 = (DisplayOwner)ToLua.ToObject(L, 3);
                int          arg2 = (int)LuaDLL.lua_tonumber(L, 4);
                SkillInfo    o    = obj.CreateSkillInfo(arg0, arg1, arg2);
                ToLua.PushObject(L, o);
                return(1);
            }
            else
            {
                return(LuaDLL.luaL_throw(L, "invalid arguments to method: SkillManager.CreateSkillInfo"));
            }
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e));
        }
    }
Пример #3
0
    /// <summary>
    /// 获取减伤
    /// </summary>
    /// <param name="active"></param>
    /// <param name="target"></param>
    /// <returns></returns>
    private static float GetDemageLower(DisplayOwner active, DisplayOwner target)
    {
        var result = 0f;

        // 计算减免加成与概率
        if (target.ClusterData.AllData.SkillInfoList != null && target.ClusterData.AllData.SkillInfoList.Count > 0)
        {
            foreach (var skill in target.ClusterData.AllData.SkillInfoList)
            {
                if (skill.IsActive)
                {
                    continue;
                }
                result += GetDemageChange(skill, target);
            }
        }
        if (target.ClusterData.AllData.BuffInfoList != null && target.ClusterData.AllData.BuffInfoList.Count > 0)
        {
            foreach (var buff in target.ClusterData.AllData.BuffInfoList)
            {
                result += GetDemageChange(buff, target);
            }
        }
        return(result);
    }
Пример #4
0
    /// <summary>
    /// 加载buff类
    /// 如果缓存中没有就从文件照片那个加载
    /// </summary>
    /// <param name="buffId">buffID</param>
    /// <param name="receive">buff的接受者</param>
    /// <param name="release">buff的释放者</param>
    /// <param name="buffRank">Buff等级</param>
    /// <returns></returns>
    public BuffInfo CreateBuffInfo(int buffId, DisplayOwner receive, DisplayOwner release, int buffRank = 1)
    {
        BuffInfo result = null;

        // 验证技能ID的有效性
        if (buffId > 0)
        {
            // 检查缓存
            if (buffDic.ContainsKey(buffId))
            {
                // 复制buff
                result = buffDic[buffId];
            }
            else
            {
                // 加载文件内容
                var buffTxt = GetBuffScript(buffId, SkillManager.Single.RunType);
                if (!string.IsNullOrEmpty(buffTxt))
                {
                    result = FormulaConstructor.BuffConstructor(buffTxt);
                    // 将其放入缓存
                    AddBuffInfo(result);
                }
            }
        }
        result = CopyBuffInfo(result);
        result.ReplaceData(buffRank);
        // 将实现放入实现列表
        buffInstanceDic.Add(result.AddtionId, result);
        result.ReceiveMember = receive;
        result.ReleaseMember = release;
        result.BuffRank      = buffRank;
        return(result);
    }
Пример #5
0
    /// <summary>
    /// 将对象放入对象池
    /// </summary>
    /// <param name="objID"></param>
    /// <param name="obj"></param>
    public void PushPool(ObjectID objID, DisplayOwner obj)
    {
        var control = obj.GameObj.GetComponent <RanderControl>();

        // 回收未确认下兵的单位时randerControl为null
        if (control != null)
        {
            control.DestoryFSM();
            if (control.bloodBarCom != null)
            {
                control.bloodBarCom.DestorySelf();
            }
            control.gameObject.SetActive(false);
            GameObject.Destroy(control);
        }
        var soldierType = obj.ClusterData.AllData.MemberData.Name;

        // 清理数据
        ClearDisplayer(obj);
        if (!displayPool.ContainsKey(soldierType))
        {
            displayPool.Add(soldierType, new Stack <GameObject>());
        }
        // 设置父级
        obj.GameObj.transform.parent = ParentManager.Instance().GetParent(ParentManager.PoolParent).transform;
        displayPool[soldierType].Push(obj.GameObj);
    }
Пример #6
0
    /// <summary>
    /// 创建技能实例
    /// </summary>
    /// <param name="skillIdList">技能ID列表</param>
    /// <param name="skillHolder">技能持有者</param>
    /// <returns>技能信息列表</returns>
    public IList <SkillInfo> CreateSkillInfoList(IList <int> skillIdList, DisplayOwner skillHolder = null)
    {
        List <SkillInfo> result = null;

        if (skillIdList != null && skillIdList.Count > 0)
        {
            result = new List <SkillInfo>();
            foreach (var skillId in skillIdList)
            {
                var skillInfo = CreateSkillInfo(skillId, skillHolder);
                if (skillInfo != null)
                {
                    result.Add(skillInfo);
                }
            }
            // 根据CD时间排序
            result.Sort((a, b) =>
            {
                if (a.CDTime > b.CDTime)
                {
                    return(1);
                }
                return(-1);
            });
        }

        return(result);
    }
Пример #7
0
    /// <summary>
    /// 加载并创建技能实例
    /// </summary>
    /// <param name="skillNum">技能ID</param>
    /// <param name="skillHolder">技能持有单位</param>
    /// <param name="skillLevel">技能等级</param>
    /// <returns>技能实例</returns>
    public SkillInfo CreateSkillInfo(int skillNum, DisplayOwner skillHolder, int skillLevel = 1)
    {
        SkillInfo result = null;

        // 验证技能ID的有效性
        if (skillNum <= 0)
        {
            return(null);
        }
        // 检查缓存
        if (SkillInfoDic.ContainsKey(skillNum))
        {
            // 复制技能数据
            result = SkillInfoDic[skillNum];
        }
        else
        {
            // 从AB文件中加载
            var skillTxt = GetSkillScript(skillNum, SkillManager.Single.RunType);
            if (!string.IsNullOrEmpty(skillTxt))
            {
                result = FormulaConstructor.SkillConstructor(skillTxt);
                // 将其放入缓存
                AddSkillInfo(result);
            }
        }
        result = CopySkillInfo(result);
        result.ReleaseMember = skillHolder;
        result.ReplaceData(skillLevel);
        // 将技能实现放入实现列表
        skillInstanceDic.Add(result.AddtionId, result);
        return(result);
    }
Пример #8
0
    /// <summary>
    /// 检测当前单位的触发事件
    /// </summary>
    private void CheckTrigger(DisplayOwner display)
    {
        var allData = display.ClusterData.AllData;

        if (allData.MemberData != null)
        {
            // 触发当前单位的所有事件
            SkillManager.Single.SetEachAction(allData.MemberData.ObjID, (type1, type2, trigger) =>
            {
                if (allData.SkillInfoList != null)
                {
                    //Debug.Log("触发技能");
                    // 触发skill类
                    SkillManager.Single.CheckAndDoSkillInfo(allData.SkillInfoList, trigger);
                }
                if (allData.BuffInfoList != null)
                {
                    //Debug.Log("触发buff");
                    // 技能触发完毕开始触发buff类
                    BuffManager.Single.CheckAndDoBuffInfo(allData.BuffInfoList, trigger);
                }
                // 计算伤害
                settlementDamageOrCure(type1, type2, trigger, allData);
            }, true);
            PushTriggerData();
        }
    }
Пример #9
0
    static int _CreateDisplayOwner(IntPtr L)
    {
        try
        {
            int count = LuaDLL.lua_gettop(L);

            if (count == 2)
            {
                UnityEngine.GameObject arg0 = (UnityEngine.GameObject)ToLua.CheckUnityObject(L, 1, typeof(UnityEngine.GameObject));
                PositionObject         arg1 = (PositionObject)ToLua.CheckUnityObject(L, 2, typeof(PositionObject));
                DisplayOwner           obj  = new DisplayOwner(arg0, arg1);
                ToLua.PushObject(L, obj);
                return(1);
            }
            else if (count == 3 && TypeChecker.CheckTypes(L, 1, typeof(UnityEngine.GameObject), typeof(PositionObject), typeof(RanderControl)))
            {
                UnityEngine.GameObject arg0 = (UnityEngine.GameObject)ToLua.CheckUnityObject(L, 1, typeof(UnityEngine.GameObject));
                PositionObject         arg1 = (PositionObject)ToLua.CheckUnityObject(L, 2, typeof(PositionObject));
                RanderControl          arg2 = (RanderControl)ToLua.CheckUnityObject(L, 3, typeof(RanderControl));
                DisplayOwner           obj  = new DisplayOwner(arg0, arg1, arg2);
                ToLua.PushObject(L, obj);
                return(1);
            }
            else
            {
                return(LuaDLL.luaL_throw(L, "invalid arguments to ctor method: DisplayOwner.New"));
            }
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e));
        }
    }
Пример #10
0
    /// <summary>
    /// 计算技能伤害/治疗
    /// </summary>
    /// <param name="member"></param>
    /// <param name="target">技能目标</param>
    /// <param name="type">伤害或治疗</param>
    /// <param name="unitType">伤害/治疗值类型</param>
    /// <param name="calculationType">计算类型</param>
    /// <param name="value">具体值, 必须大于等于0</param>
    /// <returns>伤害/治疗具体量</returns>
    public static float GetHurtForSkill(DisplayOwner member, DisplayOwner target, DemageOrCure type, HealthChangeType unitType, HealthChangeCalculationType calculationType, float value)
    {
        if (member == null ||
            member.ClusterData == null ||
            target == null ||
            target.ClusterData == null ||
            target.ClusterData.AllData.MemberData == null)
        {
            throw new Exception("目标对象为空.");
        }
        if (value < 0)
        {
            throw new Exception("伤害/治疗值不能为负数.");
        }
        var result = 0f;

        // 区分伤害类型
        switch (calculationType)
        {
        case HealthChangeCalculationType.Fix:
        {
            var zhanqianJueduizhi   = member.ClusterData.AllData.MemberData.Attack1;
            var zhandouJueduizhiAdd = 0.0f;
            var zhanqianBaifenbiAdd = 0.0f;
            var zhandouBaifenbiAdd  = 0.0f;

            // 伤害能力
            var huoli = (zhanqianJueduizhi + zhandouJueduizhiAdd) * (1 + zhanqianBaifenbiAdd + zhandouBaifenbiAdd);
            // 减伤
            var jianshanglv = AdjustJianshang(member, target);
            // 克制关系
            var kezhixishu = AdjustKezhi(member, target);
            //if (unitType == HealthChangeType.Percentage)
            //{
            //    result = target.ClusterData.AllData.MemberData.TotalHp*value;
            //}

            var shanghaijiacheng = 0.0f;
            var mianyijiacheng   = 0.0f;
            var jinengjiacheng   = 0.0f;

            // 计算增伤
            shanghaijiacheng = GetDemageUpper(member, target);

            // 计算减伤
            mianyijiacheng = GetDemageLower(member, target);

            result = huoli * (1 - jianshanglv) * kezhixishu *
                     (1 + Mathf.Max(-0.8f, (shanghaijiacheng - mianyijiacheng))) + jinengjiacheng;
        }
        break;

        case HealthChangeCalculationType.Calculation:

            break;
        }

        return(result);
    }
Пример #11
0
    public void StartFSM([NotNull] DisplayOwner obj)
    {
        //初始化状态机
        fsm         = new SoldierFSMSystem();
        fsm.Display = obj;

        // 初始化行为状态机
        InitState(obj.ClusterData.AllData.MemberData.BehaviorType);
    }
Пример #12
0
    /// <summary>
    /// 获取Display
    /// </summary>
    /// <param name="pObj">display对应的pObj</param>
    /// <returns>pObj对应的DisplayOwner</returns>
    public DisplayOwner GetElementByPositionObject(PositionObject pObj)
    {
        DisplayOwner result = null;

        if (pObj != null)
        {
            result = GetElementById(pObj.AllData.MemberData.ObjID);
        }
        return(result);
    }
Пример #13
0
 /// <summary>
 /// 判断攻守防是否满足克制关系
 /// </summary>
 /// <param name="active"></param>
 /// <param name="target"></param>
 /// <returns></returns>
 public static float AdjustKezhi(DisplayOwner active, DisplayOwner target)
 {
     // TODO 本地缓存数据
     //var config = SData_kezhi_c.Single.GetDataOfID(active.ClusterData.AllData.MemberData.ArmyType);
     //if (config.KezhiType == target.ClusterData.AllData.MemberData.ArmyType)
     //{
     //    return 1 + config.KezhiAdd;
     //}
     return(1.0f);
 }
Пример #14
0
 /// <summary>
 /// 清空显示单位身上的脚本
 /// </summary>
 /// <param name="display">被清理单位包装类</param>
 private void ClearDisplayer(DisplayOwner display)
 {
     if (display != null)
     {
         ClusterManager.Single.Remove(display.ClusterData);
         display.GameObj.RemoveComponents(typeof(ClusterData));
         display.ClusterData = null;
         display.GameObj.RemoveComponents(typeof(TriggerRunner));
         display.GameObj.RemoveComponents(typeof(RanderControl));
         display.RanderControl = null;
     }
 }
Пример #15
0
 static int CleanData(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 1);
         DisplayOwner obj = (DisplayOwner)ToLua.CheckObject(L, 1, typeof(DisplayOwner));
         obj.CleanData();
         return(0);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
Пример #16
0
    /// <summary>
    /// 普通战斗伤害结算
    /// </summary>
    /// <param name="active">伤害发起的主动方</param>
    /// <param name="target">伤害被动方</param>
    /// <returns></returns>
    public static float GetHurt(DisplayOwner active, DisplayOwner target)
    {
        var zhanqianJueduizhi   = active.ClusterData.AllData.MemberData.Attack1;
        var zhandouJueduizhiAdd = 0.0f;
        var zhanqianBaifenbiAdd = 0.0f;
        var zhandouBaifenbiAdd  = 0.0f;

        // 伤害能力
        var huoli = (zhanqianJueduizhi + zhandouJueduizhiAdd) * (1 + zhanqianBaifenbiAdd + zhandouBaifenbiAdd);
        // 暴击
        var baojixishu  = AdjustIsBaoji(active, target);
        var hurtAdd     = 0.0f;
        var antiHurtAdd = 0.0f;
        // 减伤
        var jianshanglv = AdjustJianshang(active, target);
        // 克制关系
        var kezhixishu = AdjustKezhi(active, target);

        var shanghaijiacheng = 0.0f;
        var mianyijiacheng   = 0.0f;
        var jinengjiacheng   = 0.0f;

        /**
         * 最终伤害=进攻方火力*(1-减伤率)*(IF(本次暴击,暴击伤害系数,1))*
         * (IF(满足克制关系,1+克制伤害加成,1))*
         * (1+Max(-40%,(进攻方伤害加成-防守方免伤加成)))+
         * 攻守双方技能绝对值加成和
         **/
        if (baojixishu > 1)
        {
            IsCrit = true;
        }
        else
        {
            IsCrit = false;
        }

        // 计算增伤
        shanghaijiacheng = GetDemageUpper(active, target);

        // 计算减伤
        mianyijiacheng = GetDemageLower(active, target);


        var hurt = huoli * (1 - jianshanglv) * baojixishu * kezhixishu *
                   (1 + Mathf.Max(-0.8f, (shanghaijiacheng - mianyijiacheng))) + jinengjiacheng;

        return(hurt);
    }
Пример #17
0
    ///// <summary>
    ///// 创建技能数据包装类
    ///// 点对点方式
    ///// </summary>
    ///// <param name="startPos">技能起始位置</param>
    ///// <param name="targetPos">技能目标位置</param>
    ///// <param name="targetMaxCount">技能目标上限 如果-1则无数量限制</param>
    ///// <param name="skill">被释放技能</param>
    ///// <param name="isNotLethal">是否不致死</param>
    ///// <returns>数据包装类</returns>
    //public FormulaParamsPacker GetFormulaParamsPacker(Vector3 startPos, Vector3 targetPos, int targetMaxCount, SkillBase skill, bool isNotLethal = false)
    //{
    //    var result = new FormulaParamsPacker
    //    {
    //        StartPos = startPos,
    //        TargetPos = targetPos,
    //        TargetMaxCount = targetMaxCount,
    //        IsNotLethal = isNotLethal,
    //        Skill = skill
    //    };

    //    return result;
    //}


    /// <summary>
    /// 创建技能数据包装类
    /// 对象对对象方式
    /// </summary>
    /// <param name="startObj">起始对象</param>
    /// <param name="targetObj">目标对象</param>
    /// <param name="skill">被释放技能</param>
    /// <param name="targetMaxCount">技能目标上限 如果-1则无数量限制</param>
    /// <param name="isNotLethal">是否不致死</param>
    /// <returns>数据包装类</returns>
    public FormulaParamsPacker GetFormulaParamsPacker(DisplayOwner startObj, DisplayOwner targetObj, SkillBase skill, int targetMaxCount, bool isNotLethal = false)
    {
        var result = new FormulaParamsPacker()
        {
            ReleaseMember  = startObj,
            ReceiverMenber = targetObj,
            TargetMaxCount = targetMaxCount,
            IsNotLethal    = isNotLethal,
            Skill          = skill,
            StartPos       = startObj != null ? startObj.ClusterData.transform.position : Vector3.zero,
            TargetPos      = targetObj != null ? targetObj.ClusterData.transform.position : Vector3.zero,
            SkillLevel     = skill == null ? 1 : skill.Level
        };

        return(result);
    }
Пример #18
0
 static int CreateUnit(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 2);
         int arg0 = (int)LuaDLL.luaL_checknumber(L, 1);
         CreateActorParam arg1 = (CreateActorParam)ToLua.CheckObject(L, 2, typeof(CreateActorParam));
         DisplayOwner     o    = FightUnitFactory.CreateUnit(arg0, arg1);
         ToLua.PushObject(L, o);
         return(1);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
Пример #19
0
    static int get_ClusterData(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            DisplayOwner   obj = (DisplayOwner)o;
            PositionObject ret = obj.ClusterData;
            ToLua.Push(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index ClusterData on a nil value" : e.Message));
        }
    }
Пример #20
0
    /// <summary>
    /// 伤害增强/减免计算
    /// </summary>
    /// <param name="skill">被计算技能</param>
    /// <param name="target">被计算目标</param>
    /// <returns></returns>
    private static float GetDemageChange(SkillBase skill, DisplayOwner target)
    {
        var result = 0f;

        if (skill.DemageChangeProbability > 0 && skill.DemageChange > 0)
        {
            if (skill.DemageChangeProbability >= 1 ||
                RandomPacker.Single.GetRangeI(0, 100) <= skill.DemageChangeProbability * 100)
            {
                if (Check(skill, target.ClusterData.AllData.MemberData))
                {
                    result += skill.DemageChange;
                }
            }
        }
        return(result);
    }
Пример #21
0
    static int set_GameObj(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            DisplayOwner           obj  = (DisplayOwner)o;
            UnityEngine.GameObject arg0 = (UnityEngine.GameObject)ToLua.CheckUnityObject(L, 2, typeof(UnityEngine.GameObject));
            obj.GameObj = arg0;
            return(0);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index GameObj on a nil value" : e.Message));
        }
    }
Пример #22
0
    static int set_ReleaseMember(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            AbilityBase  obj  = (AbilityBase)o;
            DisplayOwner arg0 = (DisplayOwner)ToLua.CheckObject(L, 2, typeof(DisplayOwner));
            obj.ReleaseMember = arg0;
            return(0);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index ReleaseMember on a nil value" : e.Message));
        }
    }
Пример #23
0
    static int get_ReleaseMember(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            AbilityBase  obj = (AbilityBase)o;
            DisplayOwner ret = obj.ReleaseMember;
            ToLua.PushObject(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index ReleaseMember on a nil value" : e.Message));
        }
    }
Пример #24
0
    static int get_RanderControl(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            DisplayOwner  obj = (DisplayOwner)o;
            RanderControl ret = obj.RanderControl;
            ToLua.Push(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index RanderControl on a nil value" : e.Message));
        }
    }
Пример #25
0
 static int CreateSkillInfoList(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 3);
         SkillManager obj = (SkillManager)ToLua.CheckObject(L, 1, typeof(SkillManager));
         System.Collections.Generic.IList <int> arg0 = (System.Collections.Generic.IList <int>)ToLua.CheckObject(L, 2, typeof(System.Collections.Generic.IList <int>));
         DisplayOwner arg1 = (DisplayOwner)ToLua.CheckObject(L, 3, typeof(DisplayOwner));
         System.Collections.Generic.IList <SkillInfo> o = obj.CreateSkillInfoList(arg0, arg1);
         ToLua.PushObject(L, o);
         return(1);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
Пример #26
0
    static int get_GameObj(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            DisplayOwner           obj = (DisplayOwner)o;
            UnityEngine.GameObject ret = obj.GameObj;
            ToLua.Push(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index GameObj on a nil value" : e.Message));
        }
    }
Пример #27
0
    static int set_ClusterData(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            DisplayOwner   obj  = (DisplayOwner)o;
            PositionObject arg0 = (PositionObject)ToLua.CheckUnityObject(L, 2, typeof(PositionObject));
            obj.ClusterData = arg0;
            return(0);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index ClusterData on a nil value" : e.Message));
        }
    }
Пример #28
0
    static int set_RanderControl(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            DisplayOwner  obj  = (DisplayOwner)o;
            RanderControl arg0 = (RanderControl)ToLua.CheckUnityObject(L, 2, typeof(RanderControl));
            obj.RanderControl = arg0;
            return(0);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index RanderControl on a nil value" : e.Message));
        }
    }
Пример #29
0
    /// <summary>
    /// 判断是否穿甲
    /// </summary>
    /// <param name="active">攻击方</param>
    /// <param name="target">被攻击方</param>
    /// <returns></returns>
    public static float AdjustJianshang(DisplayOwner active, DisplayOwner target)
    {
        /**
         *  穿甲=(战前值+战斗中绝对值加成和)*(1+战前加成和+战斗中百分比加成和)
         *  PS1:战斗中加成目前已知来源:被附加的BUFF,友方的光环
         *  PS2:战斗中的加成因为BUFF的属性,所以这里的加成和是计算增益减益和
         *  防御=(战前值+战斗中绝对值加成和)*(1+战前加成和+战斗中百分比加成和)
         *  装甲=(战前值+战斗中绝对值加成和)*(1+战前加成和+战斗中百分比加成和)
         * */
        //战斗中绝对值加成和
        var chuanjiaJueduizhiAdd = 0.0f;
        var chuanjiaBaifenbiAdd  = 0.0f;
        var chuanjiaZhanqianAdd  = 0.0f;

        var chuanjiashuxing = active.ClusterData.AllData.MemberData.AntiArmor;
        var chuanjia        = (chuanjiashuxing + chuanjiaJueduizhiAdd) * (1 + chuanjiaZhanqianAdd + chuanjiaBaifenbiAdd);

        var fangyuJueduizhiAdd = 0.0f;
        var fangyuBaifenbiAdd  = 0.0f;
        var fangyuZhanqianAdd  = 0.0f;

        var fangyuShuxing = target.ClusterData.AllData.MemberData.Defence;
        var fangyu        = (fangyuShuxing + chuanjiaJueduizhiAdd) * (1 + fangyuZhanqianAdd + fangyuBaifenbiAdd);

        var zhuangjiaJueduizhiADD = 0.0f;
        var zhuangjiaBaifenbiiADD = 0.0f;
        var zhuangjiaZhanqianADD  = 0.0f;

        var zhuangjiaShuxing = target.ClusterData.AllData.MemberData.Armor;
        var zhuangjia        = (zhuangjiaShuxing + zhuangjiaJueduizhiADD) * (1 + zhuangjiaZhanqianADD + zhuangjiaBaifenbiiADD);
        //判定攻击是否无视防御或装甲,攻击方有几率无视防御或装甲的技能,在1 - 1000中取随机整数a
        var wushifangyu    = 0.0f;
        var wushizhuangjia = 0.0f;

        // TODO 包装随机
        //var ran = new QKRandom((int)DateTime.Now.Ticks);
        var a  = RandomPacker.Single.GetRangeI(0, 1000);
        var a1 = RandomPacker.Single.GetRangeI(0, 1000);

        fangyu    = a <= wushifangyu * 1000 ? 0 : fangyu;
        zhuangjia = a1 <= wushizhuangjia * 1000 ? 0 : zhuangjia;

        return((fangyu + Mathf.Max(0, zhuangjia - chuanjia)) /
               (fangyu + Mathf.Max(0, zhuangjia - chuanjia) + 2000));
    }
Пример #30
0
    ///// <summary>
    ///// 创建技能数据包装类
    ///// 对象对对象方式
    ///// </summary>
    ///// <param name="startPos">技能起始位置</param>
    ///// <param name="targetPos">技能目标位置</param>
    ///// <param name="startObj">起始对象</param>
    ///// <param name="targetObj">目标对象</param>
    ///// <param name="skill">被释放技能</param>
    ///// <param name="targetMaxCount">技能目标上限 如果-1则无数量限制</param>
    ///// <param name="isNotLethal">是否不致死</param>
    ///// <returns>数据包装类</returns>
    //public FormulaParamsPacker GetFormulaParamsPacker(Vector3 startPos, Vector3 targetPos, DisplayOwner startObj, DisplayOwner targetObj, SkillBase skill, int targetMaxCount, bool isNotLethal = false)
    //{
    //    var result = new FormulaParamsPacker()
    //    {
    //        ReleaseMember = startObj,
    //        ReceiverMenber = targetObj,
    //        TargetMaxCount = targetMaxCount,
    //        IsNotLethal = isNotLethal,
    //        Skill = skill
    //    };

    //    return result;
    //}

    /// <summary>
    /// 创建技能数据包装类
    /// 对象对对象方式
    /// </summary>
    /// <param name="skill">技能对象</param>
    /// <param name="startObj">起始对象</param>
    /// <param name="targetObj">目标对象</param>
    /// <param name="isNotLethal">是否不致死</param>
    /// <returns>数据包装类</returns>
    public FormulaParamsPacker GetFormulaParamsPacker(SkillBase skill, DisplayOwner startObj, DisplayOwner targetObj, bool isNotLethal = false)
    {
        var result = new FormulaParamsPacker()
        {
            DataList = skill.DataList,
            // TODO 技能等级, 最大目标数量
            SkillLevel     = skill.Level,
            SkillNum       = skill.Num,
            ReceiverMenber = targetObj,
            ReleaseMember  = startObj,
            StartPos       = startObj.ClusterData.gameObject.transform.position,
            TargetPos      = targetObj.ClusterData.gameObject.transform.position,
            IsNotLethal    = isNotLethal,
            Skill          = skill,
        };

        return(result);
    }