Example #1
0
        public bool Create()
        {
            try
            {
                if (!ServerKernel.Maps.TryGetValue(_MAP_ID_U, out m_pMainMap) ||
                    !ServerKernel.Maps.TryGetValue(_MAP_JAIL_ID_U, out m_pJailMap))
                {
                    throw new Exception("SCW_INVALID_MAP_ID");
                }

                if (!m_pMainMap.Load() || !m_pMainMap.Load())
                {
                    throw new Exception("SCW_COULT_NOT_LOAD_MAP");
                }

                var allRank = m_pRepo.FetchByType(_RANK_TYPE_U);
                if (allRank != null)
                {
                    foreach (var rank in allRank.Where(x => x.PlayerIdentity == 0))
                    {
                        m_pSynPoints.TryAdd(rank.ObjectIdentity, rank);
                    }
                    foreach (var rank in allRank.Where(x => x.PlayerIdentity > 0))
                    {
                        m_pUserPoints.TryAdd(rank.PlayerIdentity, rank);
                    }
                }
            }
            catch
            {
                ServerKernel.Log.SaveLog("Could not start syndicate score war", true, LogType.ERROR);
                return(false);
            }
            m_pState = SyndicateWarState.NOT_RUNNING;
            return(true);
        }
Example #2
0
        public void OnTimer()
        {
            if (m_pState == SyndicateWarState.NOT_BUILT)
            {
                return;
            }

            int now = int.Parse(DateTime.Now.ToString("HHmmss"));

            if (m_pState == SyndicateWarState.NOT_RUNNING &&
                (now >= _STARTUP_TIME && now < _END_TIME))
            {
                // start
                foreach (var syn in m_pSynPoints.Values)
                {
                    syn.Value1 = 0;
                    m_pRepo.SaveOrUpdate(syn);
                }

                foreach (var user in m_pUserPoints.Values)
                {
                    user.Value1 = 0;
                    m_pRepo.SaveOrUpdate(user);
                }

                IScreenObject pScrObj;
                if (m_pMainMap.GameObjects.TryGetValue(920, out pScrObj) && pScrObj is DynamicNpc)
                {
                    DynamicNpc pNpc = pScrObj as DynamicNpc;
                    pNpc.Life = pNpc.MaxLife;
                    pNpc.SendToRange();
                }

                m_tRank.Startup(10);
                m_pState = SyndicateWarState.RUNNING;
            }
            else if (m_pState == SyndicateWarState.RUNNING &&
                     (now >= _STARTUP_TIME && now < _END_TIME))
            {
                // running
                if (m_tRank.IsActive() && m_tRank.ToNextTime())
                {
                    List <string> pRank = new List <string>(9);
                    pRank.Add("Syndicate Score War");
                    int count = 0;
                    foreach (var rnk in m_pSynPoints.Values.OrderByDescending(x => x.Value1))
                    {
                        if (rnk.Value1 > 0)
                        {
                            if (count++ < 8)
                            {
                                pRank.Add(string.Format("NÂș{0}. {1,16} - {2}", count, rnk.ObjectName.PadRight(16),
                                                        rnk.Value1));
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                    foreach (var player in m_pMainMap.Players.Values.ToList())
                    {
                        player.Send(pRank[0], ChatTone.EVENT_RANKING);
                        for (int i = 1; i < pRank.Count; i++)
                        {
                            player.Send(pRank[i], ChatTone.EVENT_RANKING_NEXT);
                        }
                    }
                }
            }
            else if (m_pState == SyndicateWarState.RUNNING &&
                     (now < _STARTUP_TIME || now > _END_TIME))
            {
                // prepare to finish
                ServerKernel.SendMessageToAll(string.Format("The time is up! The Guild Score War is over."), ChatTone.TOP_LEFT);
                m_pState = SyndicateWarState.ENDING;
            }
            else if (m_pState == SyndicateWarState.ENDING)
            {
                // end time

                int rank = 0;
                foreach (var syn in m_pSynPoints.Values.OrderByDescending(x => x.Value1))
                {
                    if (rank++ >= 4)
                    {
                        break;
                    }

                    uint synId         = syn.ObjectIdentity;
                    int  deliverMoney  = 0;
                    int  deliverEmoney = 0;
                    uint totalMoney    = ServerKernel.SYN_SCORE_MONEY_REWARD[rank - 1];
                    uint totalEmoney   = ServerKernel.SYN_SCORE_EMONEY_REWARD[rank - 1];

                    foreach (var user in
                             m_pUserPoints.Values.Where(x => x.ObjectIdentity == synId && x.PlayerIdentity > 0)
                             .OrderByDescending(x => x.Value1))
                    {
                        float nPercent = (user.Value1 / (float)syn.Value1);
                        int   money    = (int)(totalMoney * nPercent);
                        int   emoney   = (int)(totalEmoney * nPercent);
                        deliverMoney  += money;
                        deliverEmoney += emoney;

                        if (money <= 0 && emoney <= 0)
                        {
                            continue;
                        }

                        Client pClient;
                        if (ServerKernel.Players.TryGetValue(user.PlayerIdentity, out pClient))
                        {
                            pClient.Character.AwardMoney(money);
                            pClient.Character.AwardEmoney(emoney);
                            pClient.SendMessage(string.Format(ServerString.STR_SSPK_AWARDED_PRIZE,
                                                              user.Value1, money, emoney), ChatTone.GUILD);
                        }
                        else
                        {
                            DbUser pUser = Database.Characters.SearchByIdentity(user.PlayerIdentity);
                            if (pUser != null)
                            {
                                pUser.Money  = (uint)Math.Min(int.MaxValue, pUser.Money + money);
                                pUser.Emoney = (uint)Math.Min(int.MaxValue, pUser.Emoney + emoney);
                                Database.Characters.SaveOrUpdate(pUser);
                            }
                        }
                    }
                }

                ServerKernel.SendMessageToAll(string.Format("The Guild Score War is over."), ChatTone.TALK);
                m_pState = SyndicateWarState.NOT_RUNNING;
            }
        }