コード例 #1
0
        private static IEnumerator SSChangeExdataCoroutine(Coroutine co, ulong id, Dict_int_int_Data changes)
        {
            var logicAgent = TeamServer.Instance.LogicAgent;
            var msg        = logicAgent.SSChangeExdata(id, changes);

            yield return(msg.SendAndWaitUntilDone(co));
        }
コード例 #2
0
        public void FinalLogic()
        {
            if (ChickenManager.mDbData == null)
            {
                return;
            }
            Dictionary <int, Dict_int_int_Data> title = new Dictionary <int, Dict_int_int_Data>();
            var tb = Table.GetNameTitle(9000);

            if (tb != null)
            {
                Dict_int_int_Data tmp = new Dict_int_int_Data();
                tmp.Data.Add(tb.FlagId, 1);
                title.Add(0, tmp);
            }

            if (ChickenManager.mDbData.Count > 0)
            {
                var id = ChickenManager.mDbData[0].Guid;
                ChangeNameTitle(id, title[0]);
            }
            FinalActivity();
            ChickenManager.mDbData.Clear();
            Save();
        }
コード例 #3
0
 public void FinalActivity()
 {
     if (ChickenManager.mDbData == null)
     {
         return;
     }
     for (int i = 0; i < ChickenManager.mDbData.Count; i++)
     {
         var tbReward = GetCheckenReward(ChickenManager.mDbData[i].Rank);
         if (tbReward != null)
         {
             var tbMail = Table.GetMail(97);
             if (tbMail == null)
             {
                 return;
             }
             var reward = new Dictionary <int, int>();
             for (int j = 0; j < tbReward.RankItemID.Length && j < tbReward.RankItemCount.Length; j++)
             {
                 if (tbReward.RankItemID[j] > 0 && tbReward.RankItemCount[j] > 0)
                 {
                     reward.Add(tbReward.RankItemID[j], tbReward.RankItemCount[j]);
                 }
             }
             string content = string.Format(tbMail.Text, i);
             var    items   = new Dict_int_int_Data();
             items.Data.AddRange(reward);
             CoroutineFactory.NewCoroutine(SendMailCoroutine, ChickenManager.mDbData[i].Guid, tbMail.Title, content, items).MoveNext();
         }
     }
 }
コード例 #4
0
        //存储
        private IEnumerator NotifyServerAvgLevelCo(Coroutine coroutine, Dictionary <int, int> data)
        {
            var dic = new Dict_int_int_Data();

            dic.Data.AddRange(data);
            var toLogic = RankServer.Instance.SceneAgent.MotifyServerAvgLevel(dic);

            yield return(toLogic.SendAndWaitUntilDone(coroutine));
        }
コード例 #5
0
        private IEnumerator SendMailCoroutine(Coroutine co,
                                              ulong id,
                                              string title,
                                              string content,
                                              Dict_int_int_Data items)
        {
            var msg = ActivityServer.Instance.LogicAgent.SendMailToCharacter(id, title, content, items, 0);

            yield return(msg.SendAndWaitUntilDone(co));
        }
コード例 #6
0
 public void SyncExdataList(Dict_int_int_Data diff)
 {
     {
         // foreach(var i in diff.Data)
         var __enumerator3 = (diff.Data).GetEnumerator();
         while (__enumerator3.MoveNext())
         {
             var i = __enumerator3.Current;
             {
                 PlayerDataManager.Instance.SetExData(i.Key, i.Value);
             }
         }
     }
 }
コード例 #7
0
ファイル: PetIsland.cs プロジェクト: tuita520/mmorpgserver
        private IEnumerator PetIslandReduceTili(Coroutine co, ulong playerObjId, int exdataId, int num)
        {
            if (exdataId != (int)eExdataDefine.e630)
            {
                Logger.Error("PetIslandReduceTili ExData table error not 630");
                yield break;
            }

            var refreshTili = 0;

            if (!TiliDic.TryGetValue(playerObjId, out refreshTili))
            {
                yield break;
            }

            var oldvalue = refreshTili;

            refreshTili -= num;

            if (refreshTili <= 0)
            {
                // 设置剔出状态 准备剔出
                if (StateDic.ContainsKey(playerObjId))
                {
                    if (StateDic[playerObjId].state != 0)
                    {
                        StateDic[playerObjId].state = 0;
                        StateDic[playerObjId].time  = DateTime.Now.AddSeconds(10);
                    }
                }
            }
            refreshTili          = Math.Max(refreshTili, 0);
            TiliDic[playerObjId] = refreshTili;

            var data = new Dict_int_int_Data();

            if (refreshTili <= 0)
            {
                data.Data.Add((int)eExdataDefine.e630, refreshTili - oldvalue);
            }
            else
            {
                data.Data.Add((int)eExdataDefine.e630, -num);
            }

            var msg1 = SceneServer.Instance.LogicAgent.SSChangeExdata(playerObjId, data);

            yield return(msg1.SendAndWaitUntilDone(co));
        }
コード例 #8
0
        private void AddKillOrDeadRecord(ulong characterId, bool kill)
        {
            KillRecord record = null;

            if (!DictKillRecord.TryGetValue(characterId, out record))
            {
                record = new KillRecord();
                DictKillRecord.Add(characterId, record);
            }

            var oldval    = record.ContinuesKill;
            var character = FindCharacter(characterId);

            if (kill)
            {
                if (oldval >= 0)
                {
                    oldval++;
                }
                else
                {
                    oldval = 1;
                }
                record.ContinuesKill = oldval;
                record.TotalKill++;
                ObjPlayer me = character as ObjPlayer;
                if (me != null)
                {
                    var dict = new Dict_int_int_Data();
                    record.KillNum++;
                    dict.Data.Add((int)eExdataDefine.e770, 1);
                    me.SendExDataChange(dict);
                }
            }
            else
            {
                if (oldval >= 0)
                {
                    oldval = -1;
                }
                else
                {
                    oldval--;
                }
            }
            record.ContinuesKill = oldval;
        }
コード例 #9
0
        public void OnAllOk(FightQueue _this, QueueResultBase result)
        {
            // 战场开始,所有人的战场计数+1
            var changes = new Dict_int_int_Data();

            changes.Data.Add((int)eExdataDefine.e530, 1);
            foreach (var list in result.mTeamList)
            {
                foreach (var character in list)
                {
                    foreach (var data in character.mDatas)
                    {
                        Utility.SSChangeExdata(data.Id, changes);
                    }
                }
            }
        }
コード例 #10
0
        public void FinalActivity(GeneralActivity _this)
        {
            List <KeyValuePair <ulong, int> > tmpList = new List <KeyValuePair <ulong, int> >();

            foreach (var v in _this.mDbData.ID2Score)
            {
                tmpList.Add(v);
            }

            tmpList.Sort((a, b) => { return(a.Value - b.Value); });
            for (int i = 0; i < tmpList.Count; i++)
            {
                var tbArenaReward = GetArenaReward(i);
                if (tbArenaReward != null)
                {
                    var tbMail = Table.GetMail(97);
                    var reward = new Dictionary <int, int>();
                    if (tbArenaReward.DayMoney > 0)
                    {
                        reward.Add((int)eResourcesType.GoldRes, tbArenaReward.DayMoney);
                    }
                    if (tbArenaReward.DayDiamond > 0)
                    {
                        reward.Add((int)eResourcesType.DiamondBind, tbArenaReward.DayDiamond);
                    }
                    var index = 0;
                    foreach (var v in tbArenaReward.DayItemID)
                    {
                        if (i > 0 && tbArenaReward.DayItemCount[index] > 0)
                        {
                            reward.Add(v, tbArenaReward.DayItemCount[index]);
                        }
                        index++;
                    }
                    string content = string.Format(tbMail.Text, i);
                    var    items   = new Dict_int_int_Data();
                    items.Data.AddRange(reward);
                    CoroutineFactory.NewCoroutine(SendMailCoroutine, tmpList[i].Key, tbMail.Title, content, items).MoveNext();
                }
            }

            _this.mDbData.ID2Score.Clear();
            _this.bDirty = true;
        }
コード例 #11
0
ファイル: JewellWars.cs プロジェクト: tuita520/mmorpgserver
        private void OnPlayerGetExp(ObjPlayer player, JPlayer jp, int exp)
        {
            var tb = Table.GetCheckenLv(jp.lv);

            if (tb == null)
            {
                return;
            }
            jp.exp += exp;
            Dict_int_int_Data data = new Dict_int_int_Data();

            if (tb.NeedExp <= jp.exp)
            {
                var tbnew = Table.GetCheckenLv(jp.lv + 1);
                if (tbnew == null)//达到最大等级
                {
                    jp.exp = tb.NeedExp;
                }
                else
                {
                    //删除旧的buff
                    var tbold = Table.GetCheckenLv(jp.lv);
                    if (tbold != null)
                    {//buff
                        player.DeleteBuff(tbold.BaseBuff, eCleanBuffType.Clear);
                    }

                    jp.exp -= tb.NeedExp;
                    jp.lv++;

                    player.AddBuff(tbnew.BaseBuff, 1, player);

                    var ids = RandBuffList(tb.BuffGroup, 3);
                    foreach (var id in ids)
                    {
                        int lv = 0;
                        jp.buf.TryGetValue(id, out lv);
                        data.Data.Add(id, lv + 1);
                    }
                }
            }
            player.Proxy.CK_NotifyClientLevelup(player.mObjId, jp.lv, jp.exp, data);
        }
コード例 #12
0
        private IEnumerator ChangePlayedTimeCoroutine(Coroutine co, ObjPlayer player)
        {
            var enterTime = PlayerEnterTimes[player.ObjId];

            PlayerEnterTimes.Remove(player.ObjId);
            var playedTimeSec = (int)(DateTime.Now - enterTime).TotalSeconds;
            var data          = new Dict_int_int_Data();

            if (Math.Abs(mMaxTimeOneDaySec - playedTimeSec) < 10)
            {
                data.Data.Add((int)eExdataDefine.e428, mMaxTimeOneDaySec);
            }
            else
            {
                data.Data.Add((int)eExdataDefine.e428, playedTimeSec);
            }
            var msg = SceneServer.Instance.LogicAgent.SSChangeExdata(player.ObjId, data);

            yield return(msg.SendAndWaitUntilDone(co));
        }
コード例 #13
0
ファイル: CityMessage.cs プロジェクト: tuita520/u3dmmorpg
    public void CK_NotifyClientLevelup(ulong id, int lv, int exp, Dict_int_int_Data buff)
    {
        if (buff.Data != null && buff.Data.Count > 0)
        {
            OnCheckenSkillUpEvent e = new OnCheckenSkillUpEvent(lv, exp, buff.Data);
            EventDispatcher.Instance.DispatchEvent(e);
        }
        if (ObjManager.Instance == null)
        {
            return;
        }
        ObjManager.Instance.MyPlayer.UpdateChickenExp(lv, exp);

        /**  foreach (var item in ObjManager.Instance.ObjPool)
         * {
         *    if (item.Value != null && item.Value.GetObjId() == id)
         *    {
         *        Debug.Log(id.ToString() + "-------------" + lv + "========" + exp);
         *        (item.Value as ObjCharacter).UpdateChickenExp(lv, exp);
         *        break;
         *    }
         * }**/
    }
コード例 #14
0
        public override void NetDirtyHandle()
        {
            var count = mNetDirtyList.Count;

            if (count < 1)
            {
                return;
            }
            //if (mCharacter.Proxy == null) return;
            if (count == 1)
            {
                foreach (var i in mNetDirtyList)
                {
                    mCharacter.Proxy.SyncExdata(i.Key, i.Value);
                }
            }
            else
            {
                var diffData = new Dict_int_int_Data();
                diffData.Data.AddRange(mNetDirtyList);
                mCharacter.Proxy.SyncExdataList(diffData);
            }
            mNetDirtyList.Clear();
        }
コード例 #15
0
 public static void SendMail(ulong id, string title, string content, Dict_int_int_Data items)
 {
     mImpl.SendMail(id, title, content, items);
 }
コード例 #16
0
        private IEnumerator ChangeNameTitleCoroutine(Coroutine co, ulong characterId, Dict_int_int_Data change)
        {
            var msg = ActivityServer.Instance.LogicAgent.SSSetFlag(characterId, change);

            yield return(msg.SendAndWaitUntilDone(co));
        }
コード例 #17
0
ファイル: CityMessage.cs プロジェクト: tuita520/u3dmmorpg
 public void NotifyReward(Dict_int_int_Data items)
 {
 }
コード例 #18
0
ファイル: JewellWars.cs プロジェクト: tuita520/mmorpgserver
        public override void OnPlayerPickItem(ObjPlayer player, ObjDropItem item)
        {
            if (player.mIsDead)
            {
                return;
            }
            if (item.TableDrop.Type != 300)
            {
                return;
            }
            var tbChecken = Table.GetChecken(item.TableDrop.Exdata[0]);

            if (tbChecken == null)
            {
                return;
            }
            var p = _playerList.Find(r => r.objId == player.ObjId);

            if (p == null)
            {
                return;
            }

            //播放特效
            player.Proxy.NotifyPlayEffect(700);

            //添加经验
            OnPlayerGetExp(player, p, tbChecken.ExData1);
            int idx = _playerList.FindIndex(r => r.objId == player.ObjId);

            //添加吃鸡的积分
            if (_playerList[idx] != null)
            {
                _playerList[idx].point += tbChecken.ExData2;
            }

            //添加Buff
            player.AddBuff(tbChecken.BuffId, 1, player);
            //添加道具
            Dict_int_int_Data data = new Dict_int_int_Data();

            for (int i = 0; i < tbChecken.ItemID.Length && i < tbChecken.Num.Length; i++)
            {
                if (tbChecken.ItemID[i] > 0 && tbChecken.Num[i] > 0)
                {
                    data.Data.Add(tbChecken.ItemID[i], tbChecken.Num[i]);
                }
            }
            for (int i = 0; i < dropBuffList.Count; i++)
            {
                if (item.ObjId == dropBuffList[i].ObjId)
                {
                    dropBuffList.RemoveAt(i);
                    break;
                }
            }
            for (int i = 0; i < dropChickenList.Count; i++)
            {
                if (item.ObjId == dropChickenList[i].ObjId)
                {
                    dropChickenList.RemoveAt(i);
                    break;
                }
            }

            CoroutineFactory.NewCoroutine(GiveItemList, player, data).MoveNext();
        }
コード例 #19
0
 private void ChangeNameTitle(ulong characterId, Dict_int_int_Data change)
 {
     CoroutineFactory.NewCoroutine(ChangeNameTitleCoroutine, characterId, change).MoveNext();
 }
コード例 #20
0
        //战斗结束
        public void BattleOver(AllianceWar _this, int occupantId)
        {
            _this.SetStatus((int)eAllianceWarState.WaitBid);

            var allianceManager = ServerAllianceManager.GetAllianceByServer(_this.ServerId);
            var dbData          = allianceManager.GetServerData(_this.ServerId);
            var oldOccupant     = dbData.Occupant;

            dbData.Challengers.Clear();
            dbData.LastBattleTime = DateTime.Now.ToBinary();
            allianceManager.SetFlag(_this.ServerId);

            PlayerLog.WriteLog((ulong)LogType.AllianceWar,
                               "BattleOver(), ServerId = {0}, occupantId = {1}, old occupantId = {2}", _this.ServerId, occupantId,
                               dbData.Occupant);

            //如果城主没变就返回
            if (dbData.Occupant == occupantId)
            {
                return;
            }

            dbData.Occupant = occupantId;
            var alliance = ServerAllianceManager.GetAllianceById(occupantId);

            if (alliance != null)
            {
                //通知全服,城主变了
                var data = new AllianceWarOccupantData();
                data.OccupantId   = occupantId;
                data.OccupantName = alliance.Name;
                TeamServer.Instance.TeamAgent.NotifyAllianceWarOccupantData((uint)_this.ServerId, data);

                //修改玩家的称号
                var change0 = new Dict_int_int_Data();
                var tbTitle = Table.GetNameTitle(5000);
                change0.Data.Add(tbTitle.FlagId, 1);

                var change1 = new Dict_int_int_Data();
                tbTitle = Table.GetNameTitle(5001);
                change1.Data.Add(tbTitle.FlagId, 1);

                var dad = alliance.Dad;
                foreach (var id in alliance.mDBData.Members)
                {
                    var m = dad.GetCharacterData(id);
                    if (m == null)
                    {
                        continue;
                    }
                    if (m.Ladder == (int)eAllianceLadder.Chairman)
                    {
                        ChangeNameTitle(id, change0);
                    }
                    else
                    {
                        ChangeNameTitle(id, change1);
                    }
                }
            }

            //修改玩家的称号
            alliance = ServerAllianceManager.GetAllianceById(oldOccupant);
            if (alliance != null)
            {
                var change  = new Dict_int_int_Data();
                var tbTitle = Table.GetNameTitle(5000);
                change.Data.Add(tbTitle.FlagId, 0);
                tbTitle = Table.GetNameTitle(5001);
                change.Data.Add(tbTitle.FlagId, 0);
                foreach (var id in alliance.mDBData.Members)
                {
                    ChangeNameTitle(id, change);
                }
            }

            //通知logic,本服的王城占领者变了
            NotifyAllianceWarInfo(_this, occupantId);
            Init(_this);
        }
コード例 #21
0
ファイル: JewellWars.cs プロジェクト: tuita520/mmorpgserver
        private IEnumerator GiveItemList(Coroutine coroutine, ObjPlayer character, Dict_int_int_Data item)
        {
            var result = SceneServer.Instance.LogicAgent.GiveItemList(character.ObjId, item, (int)eCreateItemType.CheckenPick);

            yield return(result.SendAndWaitUntilDone(coroutine));
        }
コード例 #22
0
 public static void SSChangeExdata(ulong id, Dict_int_int_Data changes)
 {
     mImpl.SSChangeExdata(id, changes);
 }
コード例 #23
0
        public void FinalLogic(LodeManager _this)
        {
            #region 给排行前的玩家添加称号
            //给排行前的玩家添加称号
            do
            {
                List <DBAllianceTaskList> l = new List <DBAllianceTaskList>();
                List <int> lName            = new List <int>();
                foreach (var v in _this.mDbData.ActivityInfo.AllianceTaskList)
                {
                    lName.Add(v.Key);
                }
                for (int i = 0; i < lName.Count; i++)
                {
                    l.Add(_this.mDbData.ActivityInfo.AllianceTaskList[lName[i]]);
                }
                l.Sort((a, b) =>
                {
                    if (b.Flags > a.Flags)
                    {
                        return(1);
                    }
                    if (b.Flags < a.Flags)
                    {
                        return(-1);
                    }
                    return(b.Score - a.Score);
                });
                if (l.Count == 0)
                {
                    break;
                }
                var al = l[0];

                var alliance = ServerAllianceManager.GetAllianceById(al.Id);
                if (alliance == null)
                {
                    break;
                }
                {
                    Dictionary <int, Dict_int_int_Data> title = new Dictionary <int, Dict_int_int_Data>();
                    {
                        var tb = Table.GetNameTitle(8000);
                        if (tb == null)
                        {
                            break;
                        }
                        Dict_int_int_Data tmp = new Dict_int_int_Data();
                        tmp.Data.Add(tb.FlagId, 1);
                        title.Add((int)eAllianceLadder.Chairman, tmp);
                    }
                    {
                        var tb = Table.GetNameTitle(8001);
                        if (tb == null)
                        {
                            break;
                        }
                        Dict_int_int_Data tmp = new Dict_int_int_Data();
                        tmp.Data.Add(tb.FlagId, 1);
                        title.Add((int)eAllianceLadder.ViceChairman, tmp);
                    }
                    {
                        var tb = Table.GetNameTitle(8002);
                        if (tb == null)
                        {
                            break;
                        }
                        Dict_int_int_Data tmp = new Dict_int_int_Data();
                        tmp.Data.Add(tb.FlagId, 1);
                        title.Add((int)eAllianceLadder.Elder, tmp);
                    }
                    {
                        var tb = Table.GetNameTitle(8003);
                        if (tb == null)
                        {
                            break;
                        }
                        Dict_int_int_Data tmp = new Dict_int_int_Data();
                        tmp.Data.Add(tb.FlagId, 1);
                        title.Add((int)eAllianceLadder.Member, tmp);
                    }

                    var dad = alliance.Dad;
                    foreach (var id in alliance.mDBData.Members)
                    {
                        var m = dad.GetCharacterData(id);
                        if (m == null)
                        {
                            continue;
                        }
                        if (title.ContainsKey(m.Ladder) == true)
                        {
                            ChangeNameTitle(id, title[m.Ladder]);
                        }
                    }
                }
            } while (false);

            #endregion
            #region 给排行前的工会中的玩家添加称号
            //给排行前的工会中的玩家添加称号
            {
                Dictionary <int, Dict_int_int_Data> title = new Dictionary <int, Dict_int_int_Data>();
                {
                    var tb = Table.GetNameTitle(9000);
                    if (tb != null)
                    {
                        Dict_int_int_Data tmp = new Dict_int_int_Data();
                        tmp.Data.Add(tb.FlagId, 1);
                        title.Add(0, tmp);
                    }
                }
                {
                    var tb = Table.GetNameTitle(9001);
                    if (tb != null)
                    {
                        Dict_int_int_Data tmp = new Dict_int_int_Data();
                        tmp.Data.Add(tb.FlagId, 1);
                        title.Add(1, tmp);
                    }
                }
                {
                    var tb = Table.GetNameTitle(9002);
                    if (tb != null)
                    {
                        Dict_int_int_Data tmp = new Dict_int_int_Data();
                        tmp.Data.Add(tb.FlagId, 1);
                        title.Add(2, tmp);
                    }
                }

                for (int i = 0; i < 3 && i < _this.mDbData.ActivityInfo.PlayerTaskList.Count; i++)
                {
                    var id = _this.mDbData.ActivityInfo.PlayerTaskList[i].guid;
                    if (title.ContainsKey(i) == true)
                    {
                        ChangeNameTitle(id, title[i]);
                    }
                }
            }
            #endregion
        }
コード例 #24
0
 public void SendMail(ulong id, string title, string content, Dict_int_int_Data items)
 {
     CoroutineFactory.NewCoroutine(SendMailCoroutine, id, title, content, items).MoveNext();
 }
コード例 #25
0
 public void SSChangeExdata(ulong id, Dict_int_int_Data changes)
 {
     CoroutineFactory.NewCoroutine(SSChangeExdataCoroutine, id, changes).MoveNext();
 }
コード例 #26
0
        //触发掉落
        public void MonsterKill(ObjNPC npc, ulong killer)
        {
            var tbNpc = Table.GetNpcBase(npc.TypeId);

            if (tbNpc == null)
            {
                Logger.Error("MonsterKill Type={0}", npc.TypeId);
                return;
            }
            var scene      = npc.Scene;
            var GiveExp    = new Dictionary <ObjCharacter, int>();
            var playerList = npc.GetExpList(GiveExp);

            if (playerList == null)
            {
                return;
            }
            if (playerList.Count < 1)
            {
                return;
            }
            //分经验
            foreach (var i in GiveExp)
            {
                var player = i.Key as ObjPlayer;
                if (player != null)
                {
                    var giveExp = 0;
                    if (tbNpc.IsDynamicExp == 1)
                    {
                        var refExp = i.Key.Attr._ExpRef;
                        if (tbNpc.ExpMultiple > 2)
                        {
                            refExp = (tbNpc.ExpMultiple + i.Key.Attr._ExpRef - 10000);
                        }
                        giveExp =
                            (int)
                            (tbNpc.DynamicExpRatio / 10000.0f * Table.GetLevelData(player.GetLevel()).DynamicExp *refExp /
                             10000);
                    }
                    else
                    {
                        if (tbNpc.ExpMultiple < 2)
                        {
                            giveExp = i.Value * i.Key.Attr._ExpRef / 10000;
                        }
                        else
                        {
                            giveExp = (int)(1.0 * i.Value * (tbNpc.ExpMultiple + i.Key.Attr._ExpRef - 10000) / 10000);
                        }
                    }

                    var addCount = AutoActivityManager.GetActivity(1020);
                    if (addCount > 1)
                    {
                        if (tbNpc.Id >= 210000 && tbNpc.Id <= 213104)
                        {
                            giveExp = giveExp * addCount;
                        }
                    }
                    giveExp = (int)(giveExp * player.GetAdditionExp());
                    float fExp = player.Attr.ExpAdd / 10000.0f;
                    giveExp = (int)(giveExp * fExp);
                    if (player.Scene != null)
                    {
                        player.Scene.OnPlayerPickUp(player.ObjId, (int)eResourcesType.ExpRes, giveExp);
                    }

                    CoroutineFactory.NewCoroutine(MonsterKillMessageToLogic, i.Key.ObjId, npc.TypeId, giveExp,
                                                  scene.TypeId).MoveNext();
                    //攻击装备耐久相关
                    player.TryDelAttackEquipDurable();
                }
            }

            var dropId = tbNpc.DropId;

            if (scene.SpecialDrop != -1 && tbNpc.Spare != -1)
            {
                var tbSU = Table.GetSkillUpgrading(tbNpc.Spare);
                dropId = tbSU.GetSkillUpgradingValue(scene.SpecialDrop);
            }
            if (dropId == -1)
            {
                return;
            }
            var Droplist = new Dictionary <int, int>();

            //特殊掉落
            {
                List <int> list;
                if (Drop.SpecialDropForNewCharacter.TryGetValue(tbNpc.Id, out list))
                {
                    var id        = list[0];
                    var character = CharacterManager.Instance.GetCharacterControllerFromMemroy(killer);
                    if (character != null)
                    {
                        var ex = character.mDbData.SpecialDrop;
                        if (!BitFlag.GetLow(ex, id))
                        {
                            Droplist.Clear();
                            var dropid = list[character.TypeId + 1];
                            DropMother(dropid, Droplist);
                            if (Droplist.Count > 0)
                            {
                                ex = BitFlag.LongSetFlag(ex, id);
                                character.mDbData.SpecialDrop = ex;
                                character.MarkDbDirty();
                            }
                            foreach (var i in Droplist)
                            {
                                scene.CreateDropItem(tbNpc.BelongType, new List <ulong> {
                                    character.ObjId
                                }, 0, i.Key, i.Value,
                                                     npc.GetPosition());
                            }
                            Droplist.Clear();
                        }
                    }
                }
            }

            //节日掉落
            {
                var dropIds    = tbNpc.SpecialDrops;
                var yunyingIds = tbNpc.YunYingIds;
                for (int i = 0; i < yunyingIds.Count; i++)
                {
                    var tbOperationActivity = Table.GetOperationActivity(yunyingIds[i]);
                    if (null == tbOperationActivity)
                    {
                        continue;
                    }
                    if (!(System.DateTime.Now >= System.DateTime.Parse(tbOperationActivity.openTime) &&
                          System.DateTime.Now <= System.DateTime.Parse(tbOperationActivity.closeTime)))
                    {
                        continue;
                    }
                    if (i >= dropIds.Count)
                    {
                        continue;
                    }
                    Droplist.Clear();
                    DropMother(dropIds[i], Droplist);
                    var character = CharacterManager.Instance.GetCharacterControllerFromMemroy(killer);
                    if (character != null)
                    {
                        foreach (var dropitem in Droplist)
                        {
                            scene.CreateDropItem(tbNpc.BelongType,
                                                 new List <ulong> {
                                character.ObjId
                            },
                                                 0,
                                                 dropitem.Key,
                                                 dropitem.Value,
                                                 npc.GetPosition());
                            //Logger.Warn("holidaydrop: [{0},{1}]", dropitem.Key, dropitem.Value);
                        }
                        Droplist.Clear();
                    }
                }
            }

            //分掉落物品
            switch (tbNpc.BelongType)
            {
            case 0:     //队内自由拾取
            {
                DropMother(dropId, Droplist);
                var ownerList = new List <ulong>();
                foreach (var character in playerList)
                {
                    if (character != null && tbNpc.LimitFlag > 0)
                    {
                        if (character.GetObjType() == ObjType.PLAYER)
                        {
                            var p = character as ObjPlayer;
                            if (p != null)
                            {
                                Dict_int_int_Data data = new Dict_int_int_Data();
                                data.Data.Add(tbNpc.LimitFlag, 1);
                                p.SendExDataChange(data);
                            }
                        }
                    }
                    ownerList.Add(character.ObjId);
                }
                foreach (var i in Droplist)
                {
                    scene.CreateDropItem(tbNpc.BelongType, ownerList, playerList[0].GetTeamId(), i.Key, i.Value,
                                         npc.GetPosition());
                }
            }
            break;

            case 1:     //队内伤害拾取
            {
                DropMother(dropId, Droplist);
                var ownerList = new List <ulong>();
                if (playerList[0].GetTeamId() == 0)
                {
                    ownerList.Add(playerList[0].ObjId);
                    var p = playerList[0] as ObjPlayer;
                    if (p != null)
                    {
                        Dict_int_int_Data data = new Dict_int_int_Data();
                        data.Data.Add(tbNpc.LimitFlag, 1);
                        p.SendExDataChange(data);
                    }
                }
                else
                {
                    var          maxHatre     = 0;
                    ObjCharacter maxCharacter = null;
                    foreach (var character in playerList)
                    {
                        var nh = npc.GetNowHatre(character);
                        if (nh > maxHatre)
                        {
                            maxHatre     = nh;
                            maxCharacter = character;
                        }
                    }
                    //ObjCharacter maxCharacter = npc.GetMaxHatreByTeam(playerList[0].GetTeamId());
                    if (maxCharacter == null)
                    {
                        ownerList.Add(playerList[0].ObjId);
                        maxCharacter = playerList[0];
                    }
                    else
                    {
                        ownerList.Add(maxCharacter.ObjId);
                    }
                    if (maxCharacter.GetObjType() == ObjType.PLAYER)
                    {
                        var p = maxCharacter as ObjPlayer;
                        if (p != null)
                        {
                            Dict_int_int_Data data = new Dict_int_int_Data();
                            data.Data.Add(tbNpc.LimitFlag, 1);
                            p.SendExDataChange(data);
                        }
                    }
                }
                foreach (var i in Droplist)
                {
                    scene.CreateDropItem(tbNpc.BelongType, ownerList, playerList[0].GetTeamId(), i.Key, i.Value,
                                         npc.GetPosition());
                }
            }
            break;

            case 2:     //队内分别拾取
            {
                foreach (var character in playerList)
                {
                    if (npc.Scene == null || character.Scene == null)
                    {
                        continue;
                    }
                    if (npc.Scene.Guid != character.Scene.Guid)
                    {
                        continue;
                    }
                    Droplist.Clear();
                    DropMother(dropId, Droplist);
                    foreach (var i in Droplist)
                    {
                        scene.CreateDropItem(tbNpc.BelongType, new List <ulong> {
                                character.ObjId
                            }, 0, i.Key, i.Value,
                                             npc.GetPosition());
                    }

                    if (character.GetObjType() == ObjType.PLAYER)
                    {
                        var p = character as ObjPlayer;
                        if (p != null)
                        {
                            Dict_int_int_Data data = new Dict_int_int_Data();
                            data.Data.Add(tbNpc.LimitFlag, 1);
                            p.SendExDataChange(data);
                        }
                    }
                }
            }
            break;

            case 3:     //所有人分别拾取
            {
                var Hatres = npc.GetAllHatre();
                foreach (var hatre in Hatres)
                {
                    if (!(hatre.Key is ObjPlayer))
                    {
                        continue;
                    }
                    if (npc.Scene == null || hatre.Key.Scene == null)
                    {
                        continue;
                    }
                    if (npc.Scene.Guid != hatre.Key.Scene.Guid)
                    {
                        continue;
                    }

                    Droplist.Clear();
                    DropMother(dropId, Droplist);
                    foreach (var i in Droplist)
                    {
                        scene.CreateDropItem(tbNpc.BelongType, new List <ulong> {
                                hatre.Key.ObjId
                            }, 0, i.Key, i.Value,
                                             npc.GetPosition());
                    }

                    if (hatre.Key.GetObjType() == ObjType.PLAYER)
                    {
                        var p = hatre.Key as ObjPlayer;
                        if (p != null)
                        {
                            Dict_int_int_Data data = new Dict_int_int_Data();
                            data.Data.Add(tbNpc.LimitFlag, 1);
                            p.SendExDataChange(data);
                        }
                    }
                }
            }
            break;

            case 4:     //所有人自由拾取
            {
                Droplist.Clear();
                DropMother(dropId, Droplist);
                var addCount = AutoActivityManager.GetActivity(1010);
                if (addCount > 1)
                {
                    if (npc.TableNpc.Id >= 65000 && npc.TableNpc.Id < 65005)
                    {
                        for (var i = 1; i < addCount; i++)
                        {
                            DropMother(dropId, Droplist);
                        }
                    }
                }

                foreach (var i in Droplist)
                {
                    scene.CreateDropItem(tbNpc.BelongType, new List <ulong>(), 0, i.Key, i.Value, npc.GetPosition());
                }
            }
            break;
            }
        }