Пример #1
0
Файл: Guild.cs Проект: Pircs/Yi
        public void Add(YiObj human)
        {
            if (Members.Contains(human.UniqueId))
            {
                return;
            }

            Members.Add(human.UniqueId);
            human.Guild     = this;
            human.GuildRank = GuildRanks.Member;

            if (human is Player player)
            {
                player.Send(MsgSyndicateSpawn.Create(player));
                Message.SendTo(player, $"{player.Name} has joined our guild!", MsgTextType.Guild);

                foreach (var guild in Allies)
                {
                    player.Send(MsgSyndicate.Create(guild.UniqueId, GuildRequest.SetAlly));
                }
                foreach (var guild in Enemies)
                {
                    player.Send(MsgSyndicate.Create(guild.UniqueId, GuildRequest.SetEnemy));
                }
            }

            ScreenSystem.Send(human, MsgSpawn.Create(human as Player), true);
        }
Пример #2
0
        public void SendPromotionList()
        {
            if (m_pSyn == null || !IsOnline)
            {
                return;
            }

            byte synLevel = m_pSyn.Level;

            var msg = new MsgSyndicate();

            msg.Action = SyndicateRequest.SYN_PROMOTE;

            if (Position == SyndicateRank.GUILD_LEADER)
            {
                int maxDl     = (synLevel < 4 ? 2 : synLevel < 7 ? 3 : 4);
                int maxHdl    = (synLevel < 6 ? 1 : 2);
                int maxHMan   = (synLevel < 5 ? 1 : synLevel < 7 ? 2 : synLevel < 9 ? 4 : 6);
                int maxHSuper = (synLevel < 5 ? 1 : synLevel < 7 ? 2 : synLevel < 9 ? 4 : 6);
                int maxHStew  = (synLevel < 3 ? 1 : synLevel < 5 ? 2 : synLevel < 7 ? 4 : synLevel < 9 ? 6 : 8);
                int maxAide   = (synLevel < 4 ? 2 : synLevel < 6 ? 4 : 6);

                msg.Positions.Add((ushort)SyndicateRank.GUILD_LEADER + " 1 1 " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.GUILD_LEADER) + " " + 0);
                msg.Positions.Add((ushort)SyndicateRank.DEPUTY_LEADER + " " + m_pSyn.DeputyLeaderCount + " " + maxDl + " " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.DEPUTY_LEADER) + " " + 0);
                msg.Positions.Add((ushort)SyndicateRank.HONORARY_DEPUTY_LEADER + " " + m_pSyn.HonoraryDeputyLeaderCount + " " + maxHdl + " " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.HONORARY_DEPUTY_LEADER) + " " + Syndicate.HONORARY_DEPUTY_LEADER_PRICE * -1);
                msg.Positions.Add((ushort)SyndicateRank.HONORARY_MANAGER + " " + m_pSyn.HonoraryManagerCount + " " + maxHMan + " " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.HONORARY_MANAGER) + " " + Syndicate.HONORARY_MANAGER_PRICE * -1);
                msg.Positions.Add((ushort)SyndicateRank.HONORARY_SUPERVISOR + " " + m_pSyn.HonorarySupervisorCount + " " + maxHSuper + " " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.HONORARY_SUPERVISOR) + " " + Syndicate.HONORARY_SUPERVISOR_PRICE * -1);
                msg.Positions.Add((ushort)SyndicateRank.HONORARY_STEWARD + " " + m_pSyn.HonoraryStewardCount + " " + maxHStew + " " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.HONORARY_STEWARD) + " " + Syndicate.HONORARY_STEWARD_PRICE * -1);
                msg.Positions.Add((ushort)SyndicateRank.AIDE + " " + m_pSyn.AideCount + " " + maxAide + " " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.AIDE) + " " + 0);
            }
            else if (Position == SyndicateRank.LEADER_SPOUSE)
            {
                msg.Positions.Add((ushort)SyndicateRank.LEADER_SPOUSE_AIDE + " " + m_pSyn.LeaderSpouseAideCount + " 1 " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.LEADER_SPOUSE_AIDE) + " " + 0);
            }
            else if (Position == SyndicateRank.DEPUTY_LEADER || Position == SyndicateRank.HONORARY_DEPUTY_LEADER)
            {
                msg.Positions.Add((ushort)SyndicateRank.DEPUTY_LEADER_AIDE + " " + m_pSyn.DeputyLeaderAideCount + " 1 " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.DEPUTY_LEADER_AIDE) + " " + 0);
            }
            else if (Position == SyndicateRank.MANAGER || Position == SyndicateRank.HONORARY_MANAGER)
            {
                msg.Positions.Add((ushort)SyndicateRank.MANAGER_AIDE + " " + m_pSyn.ManagerAideCount + " 1 " + m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.MANAGER_AIDE) + " " + 0);
            }
            else if (Position == SyndicateRank.SUPERVISOR ||
                     Position == SyndicateRank.ARSENAL_SUPERVISOR ||
                     Position == SyndicateRank.CP_SUPERVISOR ||
                     Position == SyndicateRank.GUIDE_SUPERVISOR ||
                     Position == SyndicateRank.HONORARY_SUPERVISOR ||
                     Position == SyndicateRank.LILY_SUPERVISOR ||
                     Position == SyndicateRank.ORCHID_SUPERVISOR ||
                     Position == SyndicateRank.PK_SUPERVISOR ||
                     Position == SyndicateRank.ROSE_SUPERVISOR ||
                     Position == SyndicateRank.SILVER_SUPERVISOR ||
                     Position == SyndicateRank.TULIP_SUPERVISOR)
            {
                msg.Positions.Add((ushort)SyndicateRank.SUPERVISOR_AIDE + " " + m_pSyn.SupervisorAideCount + " 1 " +
                                  m_pSyn.Arsenal.SharedBattlePower(SyndicateRank.SUPERVISOR_AIDE) + " " + 0);
            }
            else
            {
                return;
            }
            msg.SetList();
            Send(msg);
        }
        public static void HandleSyndicate(Character pUser, MsgSyndicate pMsg)
        {
            if (pUser == null)
                return;

            switch (pMsg.Action)
            {
                #region Info / Refresh

                case SyndicateRequest.SYN_INFO:
                case SyndicateRequest.SYN_REFRESH:
                    {
                        if (pUser.Syndicate == null
                            || pUser.SyndicateMember == null)
                            return;

                        pUser.SyndicateMember.SendSyndicate();

                        MsgDutyMinContri pNewMsg = new MsgDutyMinContri();
                        foreach (var pPos in m_pShowDuty)
                            pNewMsg.Append(pPos, pUser.Syndicate.MinimumDonation(pPos));
                        pUser.Send(pNewMsg);
                        return;
                    }

                #endregion
                #region Bulletin/Announcement

                case SyndicateRequest.SYN_BULLETIN:
                    {
                        if (pUser.Syndicate == null
                            || pUser.SyndicateMember == null)
                            return;

                        if (pUser.SyndicateMember.Position != SyndicateRank.GUILD_LEADER)
                            return;
                        string msg = Encoding.ASCII.GetString(pMsg, 26, pMsg[25]);
                        if (msg.Length > 127)
                            return;
                        pUser.Syndicate.SetAnnouncement(msg);
                        return;
                    }

                #endregion
                #region Donate Silvers

                case SyndicateRequest.SYN_DONATE_SILVERS:
                    {
                        if (pUser.Syndicate == null
                            || pUser.SyndicateMember == null)
                            return;

                        if (pMsg.Param < 10000) // should donate at least 10000 silvers
                            return;

                        if (!pUser.ReduceMoney(pMsg.Param)) // not enough money
                            return;

                        pUser.Syndicate.ChangeFunds((int) pMsg.Param);
                        pUser.SyndicateMember.IncreaseMoney(pMsg.Param);
                        pUser.SyndicateMember.SendSyndicate();
                        pUser.SyndicateMember.SendCharacterInformation();
                        pUser.Syndicate.Send(string.Format(ServerString.STR_SYN_DONATE,
                                pUser.SyndicateMember.GetRankName(), pUser.Name, pMsg.Param));

                        return;
                    }

                #endregion
                #region Donate CPs

                case SyndicateRequest.SYN_DONATE_CONQUER_POINTS:
                    {
                        if (pUser.Syndicate == null
                            || pUser.SyndicateMember == null)
                            return;

                        if (!pUser.ReduceEmoney(pMsg.Param))
                            return;

                        pUser.Syndicate.ChangeEmoneyFunds((int) pMsg.Param);
                        pUser.SyndicateMember.IncreaseEmoney(pMsg.Param);
                        pUser.SyndicateMember.SendSyndicate();
                        pUser.SyndicateMember.SendCharacterInformation();
                        pUser.Syndicate.Send(string.Format(ServerString.STR_SYN_DONATE_EMONEY,
                                pUser.SyndicateMember.GetRankName(), pUser.Name, pMsg.Param));

                        return;
                    }

                #endregion
                #region Promote

                case SyndicateRequest.SYN_PROMOTE:
                    {
                        if (pUser.Syndicate == null
                            || pUser.SyndicateMember == null)
                            return;

                        pUser.SyndicateMember.SendPromotionList();
                        return;
                    }

                #endregion
                #region Paid Promotion

                case SyndicateRequest.SYN_PAID_PROMOTE:
                    {
                        if (pUser.Syndicate == null
                            || pUser.SyndicateMember == null)
                            return;

                        pUser.Syndicate.ProcessPaidPromotion(pMsg, pUser);
                        return;
                    }

                #endregion
                #region Request Promotion

                case SyndicateRequest.SYN_SEND_REQUEST:

                    if (pUser.Syndicate == null
                        || pUser.SyndicateMember == null)
                        return;

                    if (!Enum.IsDefined(typeof(SyndicateRank), (ushort)pMsg.Param))
                        return;

                    var pos = (SyndicateRank)pMsg.Param;

                    SyndicateMember pMember = pUser.Syndicate.Members.Values.FirstOrDefault(x => x.Name == pMsg.Name);
                    if (pMember == null)
                        return;

                    pUser.Syndicate.PromoteMember(pUser, pMember, pos);
                    return;

                #endregion
                #region Join Request

                case SyndicateRequest.SYN_JOIN_REQUEST:
                    {
                        // no syn join guild param: target
                        if (pUser.Syndicate != null || pUser.SyndicateMember != null)
                            return; // already joined

                        Client pTarget;
                        if (!ServerKernel.Players.TryGetValue(pMsg.Param, out pTarget))
                            return;

                        if (pUser.FetchSynInvite(pMsg.Param))
                        {
                            // do join
                            pTarget.Character.Syndicate.AppendMember(pTarget.Character, pUser.Identity, true);
                            pUser.ClearSynInvite();
                        }
                        else
                        {
                            // add join
                            pUser.SetSynJoin(pMsg.Param);
                            pMsg.Param = pUser.Identity;
                            pMsg.RequiredLevel = pUser.Level;
                            pMsg.RequiredMetempsychosis = pUser.Metempsychosis;
                            pMsg.RequiredProfession = pUser.Profession;
                            pTarget.Send(pMsg);
                            pTarget.Character.SendRelation(pUser);
                        }

                        return;
                    }

                #endregion
                #region Invite Request

                case SyndicateRequest.SYN_INVITE_REQUEST:
                    {
                        // syn invite member param: target
                        if (pUser.Syndicate == null || pUser.SyndicateMember == null)
                            return; // no syn

                        Client pTarget;
                        if (!ServerKernel.Players.TryGetValue(pMsg.Param, out pTarget))
                            return; // target not found

                        Character pTargetUser;
                        if (pUser.Syndicate.WaitQueue.TryRemove(pTarget.Character.Identity, out pTargetUser))
                        {
                            // player waiting to join
                            return;
                        }

                        if (pTarget.Character.FetchSynJoin(pUser.Identity))
                        {
                            // player requested to join
                            if (pUser.Syndicate.Members.Count >= 800)
                                return;

                            pUser.Syndicate.AppendMember(pUser, pTarget.Character.Identity, false);
                            pTarget.Character.ClearSynJoin();
                            return;
                        }
                        // inviting player to join
                        pTarget.Character.SetSynInvite(pUser.Identity);
                        pMsg.Param = pUser.Identity;
                        pMsg.RequiredLevel = pUser.Level;
                        pMsg.RequiredMetempsychosis = pUser.Metempsychosis;
                        pMsg.RequiredProfession = pUser.Profession;
                        pTarget.Send(pMsg);
                        pTarget.Character.SendRelation(pUser);
                        return;
                    }

                #endregion
                #region Quit
                case SyndicateRequest.SYN_QUIT:
                {
                    if (pUser.Syndicate == null
                        || pUser.SyndicateMember == null)
                        return;

                    if (pUser.SyndicateRank == SyndicateRank.GUILD_LEADER)
                        return;

                    pUser.Syndicate.QuitSyndicate(pUser);
                    break;
                }
                #endregion
                #region Set Requirements
                case SyndicateRequest.SYN_SET_REQUIREMENTS:
                {
                    if (pUser.Syndicate == null
                        || pUser.SyndicateMember == null)
                        return;

                    if (pUser.SyndicateRank != SyndicateRank.GUILD_LEADER)
                        return;

                    if (pMsg.RequiredProfession > 127)
                        return; // max ^ 6
                    if (pMsg.RequiredMetempsychosis > 2)
                        return;
                    if (pMsg.RequiredLevel > ServerKernel.MAX_UPLEVEL)
                        return;

                    pUser.Syndicate.SetRequirements((byte) pMsg.RequiredProfession,
                        (byte) pMsg.RequiredMetempsychosis,
                        (byte) pMsg.RequiredLevel);
                    break;
                }
                #endregion
                #region Discharge

                case SyndicateRequest.SYN_DISCHARGE:
                case SyndicateRequest.SYN_DISCHARGE2:
                case SyndicateRequest.SYN_DISCHARGE3: // discharge paid promotion
                {
                    if (pUser.Syndicate == null || pUser.SyndicateMember == null)
                        return;

                    Client pClient =
                        ServerKernel.Players.Values.FirstOrDefault(x => x.Character != null && x.Character.Name == pMsg.Name);

                    SyndicateMember pSynMember = null;
                    if (pClient == null)
                    {
                        DB.Entities.DbUser dbUser = Database.Characters.SearchByName(pMsg.Name);
                        if (dbUser == null)
                            return;

                        if (!pUser.Syndicate.Members.TryGetValue(dbUser.Identity, out pSynMember))
                            return;
                    }
                    else
                    {
                        pSynMember = pClient.Character.SyndicateMember;
                    }

                    pUser.Syndicate.DischargeMember(pUser, pSynMember);
                    break;
                }

                #endregion
                #region Ally
                case SyndicateRequest.SYN_ALLIED:
                {
                    if (pUser.Syndicate == null)
                        return;

                    if (pUser.SyndicateRank != SyndicateRank.GUILD_LEADER)
                        return;

                    if (pUser.Syndicate.Allies.Count >= pUser.Syndicate.MaxAllies())
                    {
                        pUser.Send(ServerString.STR_ALLY_FULL);
                        return;
                    }

                    Syndicate pTarget = ServerKernel.Syndicates.Values.FirstOrDefault(x => x.Name == pMsg.Name);
                    if (pTarget == null || pTarget.Deleted)
                    {
                        pUser.Send(ServerString.STR_SYN_NO_EXIST);
                        return;
                    }

                    if (!pTarget.LeaderIsOnline)
                    {
                        pUser.Send(ServerString.STR_SYN_LEADER_NOT_ONLINE);
                        return;
                    }

                    Character pTargetClient = pTarget.LeaderRole;
                    
                    RequestBox pBox = new RequestBox
                    {
                        OwnerIdentity = pUser.SyndicateIdentity,
                        OwnerName = pUser.SyndicateName,
                        ObjectIdentity = pTarget.Identity,
                        ObjectName = pTarget.Name,
                        Type = RequestBoxType.SYNDICATE_ALLY,
                        Message = string.Format("{0} Guild Leader of {1} wants to be your ally. Do you accept?", pUser.Name, pUser.SyndicateName)
                    };
                    pTargetClient.RequestBox = pUser.RequestBox = pBox;
                    pBox.Send(pTargetClient);
                    break;
                }
                #endregion
                #region Remove Ally
                case SyndicateRequest.SYN_NEUTRAL1:
                {
                    if (pUser.Syndicate == null)
                        return;

                    if (pUser.SyndicateRank != SyndicateRank.GUILD_LEADER)
                        return;

                    Syndicate pTarget = ServerKernel.Syndicates.Values.FirstOrDefault(x => x.Name == pMsg.Name);
                    if (pTarget == null || pTarget.Deleted)
                    {
                        pUser.Send(ServerString.STR_SYN_NO_EXIST);
                        return;
                    }

                    pUser.Syndicate.RemoveAlliance(pTarget.Identity);
                    break;
                }
                #endregion
                #region Enemy
                case SyndicateRequest.SYN_ENEMIED:
                {
                    if (pUser.Syndicate == null)
                        return;

                    if (pUser.SyndicateRank != SyndicateRank.GUILD_LEADER)
                        return;

                    if (pUser.Syndicate.Allies.Count >= pUser.Syndicate.MaxEnemies())
                    {
                        pUser.Send(ServerString.STR_ENEMY_FULL);
                        return;
                    }

                    Syndicate pTarget = ServerKernel.Syndicates.Values.FirstOrDefault(x => x.Name == pMsg.Name);
                    if (pTarget == null || pTarget.Deleted)
                    {
                        pUser.Send(ServerString.STR_SYN_NO_EXIST);
                        return;
                    }

                    pUser.Syndicate.AntagonizeSyndicate(pTarget);
                    break;
                }
                #endregion
                #region Peace
                case SyndicateRequest.SYN_NEUTRAL2:
                {
                    if (pUser.Syndicate == null)
                        return;

                    if (pUser.SyndicateRank != SyndicateRank.GUILD_LEADER)
                        return;

                    Syndicate pTarget = ServerKernel.Syndicates.Values.FirstOrDefault(x => x.Name == pMsg.Name);
                    if (pTarget == null || pTarget.Deleted)
                    {
                        pUser.Send(ServerString.STR_SYN_NO_EXIST);
                        return;
                    }

                    pUser.Syndicate.RemoveEnemy(pTarget.Identity);
                    break;
                }
                #endregion
                default:
                    ServerKernel.Log.SaveLog("Missing handler for 1107:" + pMsg.Action, true);
                    return;
            }
        }
Пример #4
0
        public bool Destroy()
        {
            lock (World.AllSyndicates)
            {
                if (World.AllSyndicates.ContainsKey(Id))
                {
                    Msg msg = null;

                    msg = new MsgTalk(
                        "SYSTEM", "ALLUSERS",
                        String.Format(StrRes.STR_SYN_DISBAND, Name),
                        Channel.GM, Color.White);
                    World.BroadcastMsg(msg);

                    msg = new MsgSyndicate((UInt16)Id, MsgSyndicate.Action.DestroySyn);
                    World.BroadcastMsg(msg);

                    Syndicate master = GetMasterSyn();
                    Player    player = null;

                    lock (mMembers)
                    {
                        List <Syndicate.Member> members = new List <Syndicate.Member>(mMembers.Values);
                        members.Add(mLeader);

                        foreach (Syndicate.Member member in members)
                        {
                            if (master == this)
                            {
                                if (World.AllPlayers.TryGetValue(member.Id, out player))
                                {
                                    LeaveSyn(player, false, true);
                                }
                                else
                                {
                                    Database.LeaveSyn(member.Name);
                                }
                            }
                            else
                            {
                                master.AddMember(player);
                            }
                        }
                    }

                    foreach (UInt16 allyId in Allies)
                    {
                        Syndicate ally = null;
                        if (World.AllSyndicates.TryGetValue(allyId, out ally))
                        {
                            if (ally.Allies.Contains(Id))
                            {
                                var allies = ally.Allies;
                                allies[allies.IndexOf(Id)] = 0;
                                ally.Allies = allies;

                                msg = new MsgSyndicate(Id, MsgSyndicate.Action.ClearAlly);
                                World.BroadcastSynMsg(ally, msg);
                            }
                        }
                    }

                    World.AllSyndicates.Remove(Id);
                    return(Database.Delete(this));
                }
            }

            return(false);
        }