Ejemplo n.º 1
0
        public static int NotifyInjured(SocketListener sl, TCPOutPacketPool pool, GameClient client, FakeRoleItem enemy, int burst, int injure, double injurePercent, int attackType, bool forceBurst, int addInjure, double attackPercent, int addAttackMin, int addAttackMax, double baseRate = 1.0, int addVlue = 0, int nHitFlyDistance = 0)
        {
            int ret = 0;

            if ((enemy as FakeRoleItem).CurrentLifeV > 0)
            {
                injure = 1000;
                injure = (int)((double)injure * injurePercent);
                ret    = injure;
                (enemy as FakeRoleItem).CurrentLifeV -= injure;
                (enemy as FakeRoleItem).CurrentLifeV  = Global.GMax((enemy as FakeRoleItem).CurrentLifeV, 0);
                int enemyLife = (enemy as FakeRoleItem).CurrentLifeV;
                (enemy as FakeRoleItem).AttackedRoleID = client.ClientData.RoleID;
                GameManager.ClientMgr.SpriteInjure2Blood(sl, pool, client, injure);
                (enemy as FakeRoleItem).AddAttacker(client.ClientData.RoleID, Global.GMax(0, injure));
                GameManager.SystemServerEvents.AddEvent(string.Format("假人减血, Injure={0}, Life={1}", injure, enemyLife), EventLevels.Debug);
                if ((enemy as FakeRoleItem).CurrentLifeV <= 0)
                {
                    GameManager.SystemServerEvents.AddEvent(string.Format("假人死亡, roleID={0}", (enemy as FakeRoleItem).FakeRoleID), EventLevels.Debug);
                    FakeRoleManager.ProcessFakeRoleDead(sl, pool, client, enemy as FakeRoleItem);
                }
                Point hitToGrid = new Point(-1.0, -1.0);
                if (nHitFlyDistance > 0)
                {
                    MapGrid mapGrid  = GameManager.MapGridMgr.DictGrids[client.ClientData.MapCode];
                    int     nGridNum = nHitFlyDistance * 100 / mapGrid.MapGridWidth;
                    if (nGridNum > 0)
                    {
                        hitToGrid = ChuanQiUtils.HitFly(client, enemy, nGridNum);
                    }
                }
                if ((enemy as FakeRoleItem).AttackedRoleID >= 0 && (enemy as FakeRoleItem).AttackedRoleID != client.ClientData.RoleID)
                {
                    GameClient findClient = GameManager.ClientMgr.FindClient((enemy as FakeRoleItem).AttackedRoleID);
                    if (null != findClient)
                    {
                        GameManager.ClientMgr.NotifySpriteInjured(sl, pool, findClient, findClient.ClientData.MapCode, findClient.ClientData.RoleID, (enemy as FakeRoleItem).FakeRoleID, 0, 0, (double)enemyLife, findClient.ClientData.Level, hitToGrid, 0, EMerlinSecretAttrType.EMSAT_None, 0);
                        ClientManager.NotifySelfEnemyInjured(sl, pool, findClient, findClient.ClientData.RoleID, enemy.FakeRoleID, 0, 0, (double)enemyLife, 0L, 0, EMerlinSecretAttrType.EMSAT_None, 0);
                    }
                }
                GameManager.ClientMgr.NotifySpriteInjured(sl, pool, client, client.ClientData.MapCode, client.ClientData.RoleID, (enemy as FakeRoleItem).FakeRoleID, burst, injure, (double)enemyLife, client.ClientData.Level, hitToGrid, 0, EMerlinSecretAttrType.EMSAT_None, 0);
                ClientManager.NotifySelfEnemyInjured(sl, pool, client, client.ClientData.RoleID, enemy.FakeRoleID, burst, injure, (double)enemyLife, 0L, 0, EMerlinSecretAttrType.EMSAT_None, 0);
                if (!client.ClientData.DisableChangeRolePurpleName)
                {
                    GameManager.ClientMgr.ForceChangeRolePurpleName2(sl, pool, client);
                }
            }
            return(ret);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 通知其他人被攻击(单攻),并且被伤害(同一个地图才需要通知)
        /// </summary>
        /// <param name="client"></param>
        public static int NotifyInjured(SocketListener sl, TCPOutPacketPool pool, GameClient client, FakeRoleItem enemy, int burst, int injure, double injurePercent, int attackType, bool forceBurst, int addInjure, double attackPercent, int addAttackMin, int addAttackMax, double baseRate = 1.0, int addVlue = 0, int nHitFlyDistance = 0)
        {
            int    ret = 0;
            object obj = enemy;

            {
                //怪物必须或者才操作
                if ((obj as FakeRoleItem).CurrentLifeV > 0)
                {
                    injure = 1000;

                    // 技能改造[3/13/2014 LiaoWei]
                    //injure = (int)(injure * baseRate + addVlue);

                    // 技能中可配置伤害百分比
                    injure = (int)(injure * injurePercent);
                    ret    = injure;

                    (obj as FakeRoleItem).CurrentLifeV -= (int)injure; //是否需要锁定
                    (obj as FakeRoleItem).CurrentLifeV  = Global.GMax((obj as FakeRoleItem).CurrentLifeV, 0);
                    int enemyLife = (int)(obj as FakeRoleItem).CurrentLifeV;
                    (obj as FakeRoleItem).AttackedRoleID = client.ClientData.RoleID;

                    //判断是否将给敌人的伤害转化成自己的血量增长
                    GameManager.ClientMgr.SpriteInjure2Blood(sl, pool, client, injure);

                    //将攻击者加入历史列表
                    (obj as FakeRoleItem).AddAttacker(client.ClientData.RoleID, Global.GMax(0, injure));

                    GameManager.SystemServerEvents.AddEvent(string.Format("假人减血, Injure={0}, Life={1}", injure, enemyLife), EventLevels.Debug);

                    //判断怪物是否死亡
                    if ((int)(obj as FakeRoleItem).CurrentLifeV <= 0)
                    {
                        GameManager.SystemServerEvents.AddEvent(string.Format("假人死亡, roleID={0}", (obj as FakeRoleItem).FakeRoleID), EventLevels.Debug);

                        /// 处理怪物死亡
                        ProcessFakeRoleDead(sl, pool, client, (obj as FakeRoleItem));
                    }

                    Point hitToGrid = new Point(-1, -1);

                    // 处理击飞 [3/15/2014 LiaoWei]
                    if (nHitFlyDistance > 0)
                    {
                        MapGrid mapGrid = GameManager.MapGridMgr.DictGrids[client.ClientData.MapCode];

                        int nGridNum = nHitFlyDistance * 100 / mapGrid.MapGridWidth;

                        if (nGridNum > 0)
                        {
                            hitToGrid = ChuanQiUtils.HitFly(client, enemy, nGridNum);
                        }
                    }

                    if ((obj as FakeRoleItem).AttackedRoleID >= 0 && (obj as FakeRoleItem).AttackedRoleID != client.ClientData.RoleID)
                    {
                        GameClient findClient = GameManager.ClientMgr.FindClient((obj as FakeRoleItem).AttackedRoleID);
                        if (null != findClient)
                        {
                            //通知其他在线客户端
                            GameManager.ClientMgr.NotifySpriteInjured(sl, pool, findClient, findClient.ClientData.MapCode, findClient.ClientData.RoleID, (obj as FakeRoleItem).FakeRoleID, 0, 0, enemyLife, findClient.ClientData.Level, hitToGrid);

                            //向自己发送敌人受伤的信息
                            ClientManager.NotifySelfEnemyInjured(sl, pool, findClient, findClient.ClientData.RoleID, enemy.FakeRoleID, 0, 0, enemyLife, 0);
                        }
                    }

                    //通知其他在线客户端
                    GameManager.ClientMgr.NotifySpriteInjured(sl, pool, client, client.ClientData.MapCode, client.ClientData.RoleID, (obj as FakeRoleItem).FakeRoleID, burst, injure, enemyLife, client.ClientData.Level, hitToGrid);

                    //向自己发送敌人受伤的信息
                    ClientManager.NotifySelfEnemyInjured(sl, pool, client, client.ClientData.RoleID, enemy.FakeRoleID, burst, injure, enemyLife, 0);

                    //通知紫名信息(限制当前地图)
                    if (!client.ClientData.DisableChangeRolePurpleName)
                    {
                        GameManager.ClientMgr.ForceChangeRolePurpleName2(sl, pool, client);
                    }
                }
            }

            return(ret);
        }