Ejemplo n.º 1
0
        private static void OnAllianceRequestAllianceUnitsMessageReceived(AllianceRequestAllianceUnitsMessage message)
        {
            if (AllianceManager.TryGet(message.AccountId, out Alliance alliance) && alliance.Members.TryGetValue(message.MemberId, out AllianceMemberEntry memberEntry))
            {
                for (int i = 0; i < alliance.StreamEntryList.Size(); i++)
                {
                    StreamEntry streamEntry = StreamManager.GetAllianceStream(alliance.StreamEntryList[i]);

                    if (streamEntry != null && streamEntry.GetStreamEntryType() == StreamEntryType.DONATE && streamEntry.GetSenderAvatarId().Equals(memberEntry.GetAvatarId()))
                    {
                        alliance.RemoveStreamEntry(streamEntry.GetId());
                    }
                }

                DonateStreamEntry donateStreamEntry = new DonateStreamEntry();
                AllianceStreamEntryUtil.SetSenderInfo(donateStreamEntry, memberEntry);

                string donateMessage = message.Message;

                if (donateMessage.Length > 128)
                {
                    donateMessage = donateMessage.Substring(0, 128);
                }

                donateStreamEntry.SetMessage(donateMessage);
                donateStreamEntry.SetCasteLevel(message.CastleUpgradeLevel, message.CastleUsedCapacity, message.CastleSpellUsedCapacity, message.CastleTotalCapacity, message.CastleSpellTotalCapacity);

                StreamManager.Create(alliance.Id, donateStreamEntry);

                alliance.AddStreamEntry(donateStreamEntry);

                AllianceManager.Save(alliance);
            }
        }
        private void OnDonateAllianceUnitMessageReceived(DonateAllianceUnitMessage message)
        {
            if (this.m_session.Alliance != null)
            {
                Alliance            alliance = this.m_session.Alliance;
                LogicCombatItemData unitData = message.GetAllianceUnitData();

                if (!unitData.IsDonationDisabled())
                {
                    if (message.UseQuickDonate())
                    {
                        if (!LogicDataTables.GetGlobals().EnableQuickDonate() || this.m_session.LogicClientAvatar.GetDiamonds() < unitData.GetDonateCost())
                        {
                            return;
                        }
                    }
                    else
                    {
                        if (this.m_session.LogicClientAvatar.GetUnitCount(unitData) <= 0)
                        {
                            return;
                        }
                    }

                    if (alliance.StreamEntryList.IndexOf(message.GetStreamId()) != -1)
                    {
                        StreamEntry streamEntry = StreamManager.GetAllianceStream(message.GetStreamId());

                        if (streamEntry.GetStreamEntryType() == StreamEntryType.DONATE)
                        {
                            DonateStreamEntry donateStreamEntry = (DonateStreamEntry)streamEntry;

                            if (donateStreamEntry.CanAddDonation(this.m_session.AccountId, message.GetAllianceUnitData(), alliance.Header.GetAllianceLevel()))
                            {
                                donateStreamEntry.AddDonation(this.m_session.AccountId, unitData, this.m_session.LogicClientAvatar.GetUnitUpgradeLevel(unitData));
                                donateStreamEntry.SetDonationPendingRequestCount(donateStreamEntry.GetDonationPendingRequestCount() + 1);

                                StreamManager.Save(donateStreamEntry);

                                alliance.UpdateStreamEntry(donateStreamEntry);

                                if (message.UseQuickDonate())
                                {
                                    this.m_session.LogicClientAvatar.CommodityCountChangeHelper(0, unitData, -1);
                                }

                                LogicDonateAllianceUnitCommand logicDonateAllianceUnitCommand = new LogicDonateAllianceUnitCommand();
                                logicDonateAllianceUnitCommand.SetData(unitData, streamEntry.GetId(), message.UseQuickDonate());
                                ServerMessageManager.SendMessage(new GameAllowServerCommandMessage
                                {
                                    AccountId     = this.m_session.AccountId,
                                    ServerCommand = logicDonateAllianceUnitCommand
                                }, 9);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 3
0
        private static void OnAllianceUnitDonateResponseMessageReceived(AllianceUnitDonateResponseMessage message)
        {
            if (AllianceManager.TryGet(message.AccountId, out Alliance alliance))
            {
                StreamEntry streamEntry = StreamManager.GetAllianceStream(message.StreamId);

                if (streamEntry != null)
                {
                    DonateStreamEntry donateStreamEntry = (DonateStreamEntry)streamEntry;

                    if (message.Success)
                    {
                        LogicAllianceLevelData           allianceLevel = LogicDataTables.GetAllianceLevel(alliance.Header.GetAllianceLevel());
                        LogicAllianceUnitReceivedCommand logicAllianceUnitReceivedCommand = new LogicAllianceUnitReceivedCommand();
                        logicAllianceUnitReceivedCommand.SetData(message.MemberName, message.Data,
                                                                 LogicMath.Clamp(message.UpgradeLevel + allianceLevel.GetTroopDonationUpgrade(), 0, message.Data.GetUpgradeLevelCount() - 1));
                        ServerMessageManager.SendMessage(new GameAllowServerCommandMessage
                        {
                            AccountId     = donateStreamEntry.GetSenderAvatarId(),
                            ServerCommand = logicAllianceUnitReceivedCommand
                        }, 9);
                    }
                    else
                    {
                        donateStreamEntry.RemoveDonation(message.MemberId, message.Data, message.UpgradeLevel);
                        alliance.UpdateStreamEntry(donateStreamEntry);
                    }

                    donateStreamEntry.SetDonationPendingRequestCount(donateStreamEntry.GetDonationPendingRequestCount() - 1);

                    if (donateStreamEntry.IsCastleFull() && donateStreamEntry.GetDonationPendingRequestCount() <= 0)
                    {
                        alliance.RemoveStreamEntry(donateStreamEntry.GetId());
                        AllianceManager.Save(alliance);
                    }
                    else
                    {
                        StreamManager.Save(donateStreamEntry);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        internal override void Process()
        {
            Player Player = this.Device.GameMode.Level.Player;

            if (Player.InAlliance)
            {
                Alliance    Alliance = Player.Alliance;
                StreamEntry Stream   = Alliance.Streams.Get(this.StreamId);

                if (Stream != null)
                {
                    if (Stream is DonateStreamEntry)
                    {
                        DonateStreamEntry DonationStream = (DonateStreamEntry)Stream;
                        Player            Target         = Resources.Accounts.LoadAccount(Stream.SenderHighId, Stream.SenderLowId)?.Player;
                        if (Target != null)
                        {
                            if (Target.InAlliance)
                            {
                                if (Target.AllianceId == Player.AllianceId)
                                {
                                    if (this.UnitType == 1)
                                    {
                                        if (this.Unit is SpellData)
                                        {
                                            SpellData SpellData = (SpellData)this.Unit;
                                            if (DonationStream.MaxSpell >= DonationStream.UsedSpell + SpellData.HousingSpace)
                                            {
                                                if (this.UseDiamonds)
                                                {
                                                    int Cost = SpellData.DonateCost;
                                                    if (Player.HasEnoughDiamonds(Cost))
                                                    {
                                                        Player.UseDiamonds(Cost);
                                                    }
                                                    else
                                                    {
                                                        Logging.Error(this.GetType(), "Unable to donate unit. The player use diamonds to donate but doesn't have enough diamonds!");
                                                        return;
                                                    }
                                                }

                                                int      UnitLevel = Player.GetUnitUpgradeLevel(SpellData);
                                                UnitItem Unit      = new UnitItem(SpellData.GlobalId, 1, UnitLevel);

                                                DonationStream.New = false;

                                                Target.AllianceUnits.Add(Unit);
                                                Unit.DonatorId = Player.UserId;
                                                DonationStream.Units.Add(Unit, Player.UserId);

                                                int HousingSpace = SpellData.HousingSpace;
                                                DonationStream.UsedSpell       += HousingSpace;
                                                Target.CastleUsedSpellCapacity += HousingSpace;

                                                Player.Donation         += HousingSpace;
                                                Target.DonationReceived += HousingSpace;
                                                Player.AddExperience(HousingSpace);

                                                this.Device.GameMode.CommandManager.AddCommand(new Donate_Unit_Callback(this.Device)
                                                {
                                                    StreamId = this.StreamId, UnitType = this.UnitType, UnitId = SpellData.GlobalId, UseDiamonds = this.UseDiamonds
                                                });

                                                if (Target.Connected)
                                                {
                                                    Target.Level.GameMode.CommandManager.AddCommand(new Alliance_Unit_Received(Target.Level.GameMode.Device)
                                                    {
                                                        Donator = Player.Name, UnitType = this.UnitType, UnitId = SpellData.GlobalId, Level = UnitLevel
                                                    });
                                                }

                                                Alliance.Streams.Update(Stream);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        if (this.Unit is CharacterData)
                                        {
                                            CharacterData CharacterData = (CharacterData)this.Unit;
                                            if (DonationStream.MaxTroop >= DonationStream.UsedTroop + CharacterData.HousingSpace)
                                            {
                                                if (this.UseDiamonds)
                                                {
                                                    int Cost = CharacterData.DonateCost;
                                                    if (Player.HasEnoughDiamonds(Cost))
                                                    {
                                                        Player.UseDiamonds(Cost);
                                                    }
                                                    else
                                                    {
                                                        Logging.Error(this.GetType(), "Unable to donate unit. The player use diamonds to donate but doesn't have enough diamonds!");
                                                        return;
                                                    }
                                                }

                                                int      UnitLevel = Player.GetUnitUpgradeLevel(CharacterData);
                                                UnitItem Unit      = new UnitItem(CharacterData.GlobalId, 1, UnitLevel);

                                                DonationStream.New = false;

                                                Target.AllianceUnits.Add(Unit);
                                                Unit.DonatorId = Player.UserId;
                                                DonationStream.Units.Add(Unit, Player.UserId);

                                                int HousingSpace = CharacterData.HousingSpace;
                                                DonationStream.UsedTroop  += HousingSpace;
                                                Target.CastleUsedCapacity += HousingSpace;

                                                Player.Donation         += HousingSpace;
                                                Target.DonationReceived += HousingSpace;
                                                Player.AddExperience(HousingSpace);

                                                this.Device.GameMode.CommandManager.AddCommand(new Donate_Unit_Callback(this.Device)
                                                {
                                                    StreamId = this.StreamId, UnitType = this.UnitType, UnitId = CharacterData.GlobalId, UseDiamonds = this.UseDiamonds
                                                });

                                                if (Target.Connected)
                                                {
                                                    Target.Level.GameMode.CommandManager.AddCommand(new Alliance_Unit_Received(Target.Level.GameMode.Device)
                                                    {
                                                        Donator = Player.Name, UnitType = this.UnitType, UnitId = CharacterData.GlobalId, Level = UnitLevel
                                                    });
                                                }

                                                Alliance.Streams.Update(Stream);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }