public short CalculateEarnedHonor(CharacterFighter character)
        {
            short result;

            if (base.Draw)
            {
                result = 0;
            }
            else
            {
                if (character.OpposedTeam.AlignmentSide == AlignmentSideEnum.ALIGNMENT_NEUTRAL)
                {
                    result = 0;
                }
                else
                {
                    double num  = (double)base.Winners.GetAllFightersWithLeavers().Sum((FightActor entry) => (int)entry.Level);
                    double num2 = (double)base.Losers.GetAllFightersWithLeavers().Sum((FightActor entry) => (int)entry.Level);
                    double num3 = System.Math.Floor(System.Math.Sqrt((double)character.Level) * 10.0 * (num2 / num));
                    if (base.Losers == character.Team)
                    {
                        num3 = -num3;
                    }
                    result = (short)num3;
                }
            }
            return(result);
        }
예제 #2
0
        public void SendFighterDispositionInformations(CharacterFighter newFighter)
        {
            foreach (var fighter in this.Fighters.Where(x => x is CharacterFighter))
            {
                var characterFighter = (CharacterFighter)fighter;

                var fighterClient = this.Map.GetClientFromCharacter(characterFighter.Character);

                if (fighterClient == null)
                {
                    continue;
                }

                IdentifiedEntityDispositionInformations identifiedEntityDispositionInformations = new IdentifiedEntityDispositionInformations((int)newFighter.CellId, 1, (double)newFighter.Id);
                fighterClient.SendPacket(new GameEntitiesDispositionMessage(new List <IdentifiedEntityDispositionInformations>()
                {
                    identifiedEntityDispositionInformations
                }));

                if (fighter is CharacterFighter)
                {
                    fighterClient.SendPacket(new GameFightShowFighterMessage(newFighter.GetGameFightCharacterInformations()));
                }
            }
        }
예제 #3
0
        protected override IEnumerable <IFightResult> GenerateLeaverResults(CharacterFighter leaver, out IFightResult leaverResult)
        {
            var rankLoose = CalculateRankLoose(leaver);

            leaverResult = null;

            var list = new List <IFightResult>();

            foreach (var fighter in GetFightersAndLeavers().OfType <CharacterFighter>())
            {
                var outcome = fighter.Team == leaver.Team
                    ? FightOutcomeEnum.RESULT_LOST
                    : FightOutcomeEnum.RESULT_VICTORY;

                var result = new ArenaFightResult(fighter, outcome, new FightLoot(), fighter == leaver ? rankLoose : 0, false);

                if (fighter == leaver)
                {
                    leaverResult = result;
                }

                list.Add(result);
            }

            return(list);
        }
예제 #4
0
        public ulong GetPvMExperience(CharacterFighter fighter)
        {
            var pMonstersList = new List <ExperienceFormulas.MonsterData>();
            var pMembersList  = new List <ExperienceFormulas.GroupMemberData>();


            foreach (var monster in fighter.OposedTeam().GetFighters <BrainFighter>(false).FindAll(x => !x.IsSummon))
            {
                pMonstersList.Add(new ExperienceFormulas.MonsterData(monster.Level, monster.Xp));
            }

            foreach (var ally in fighter.Team.GetFighters <CharacterFighter>(false))
            {
                pMembersList.Add(new ExperienceFormulas.GroupMemberData(ally.Level, false));
            }

            ExperienceFormulas formulas = new ExperienceFormulas();

            formulas.initXpFormula(new ExperienceFormulas.PlayerData(fighter.Level,
                                                                     fighter.Character.Record.Stats.Wisdom.Total(),
                                                                     (fighter.Character.ExpMultiplicator + fighter.Character.Map.SubArea.ExperienceRate) * WorldConfiguration.Instance.XpRate),
                                   pMonstersList,
                                   pMembersList,
                                   0,
                                   0);

            if (fighter.Team.GetFighters <PlayableFighter>(false).Count > 1)
            {
                return((ulong)formulas._xpGroup);
            }
            else
            {
                return((ulong)formulas._xpSolo);
            }
        }
예제 #5
0
        private void OnFightEnded(Character character, CharacterFighter fighter)
        {
            var effect = Effects.OfType <EffectDice>().FirstOrDefault(x => x.EffectId == EffectsEnum.Effect_RemainingFights);

            if (effect == null)
            {
                return;
            }

            if (fighter.Fight.IsPvP)
            {
                Owner.Inventory.ApplyItemEffects(this, force: ItemEffectHandler.HandlerOperation.APPLY);
            }

            Invalidate();

            if (!fighter.Fight.IsPvP)
            {
                if (--effect.Value <= 0)
                {
                    Owner.Inventory.RemoveItem(this);
                }
                else
                {
                    Owner.Inventory.RefreshItem(this);
                }
            }
        }
예제 #6
0
        public void ToggleReady(CharacterFighter actor, bool ready = true)
        {
            if (!m_started)
            {
                return;
            }

            if (ready && m_fighters.Contains(actor))
            {
                m_fighters.Remove(actor);
            }
            else if (!ready)
            {
                m_fighters.Add(actor);
            }

            if (m_fighters.Count != 0)
            {
                return;
            }

            if (m_timer != null)
            {
                m_timer.Dispose();
            }

            NotifySuccess();
        }
예제 #7
0
        public static void SendGameFightResumeMessage(IPacketReceiver client, CharacterFighter fighter)
        {
            var slaves = fighter.Summons.Where(x => x.IsControlled());

            if (slaves.Any())
            {
                client.Send(new GameFightResumeWithSlavesMessage(
                                fighter.Fight.GetBuffs().Select(entry => entry.GetFightDispellableEffectExtendedInformations()),
                                fighter.Fight.GetTriggers().Select(entry => entry.GetGameActionMark(fighter)),
                                fighter.Fight.TimeLine.RoundNumber,
                                !fighter.Fight.IsStarted ? 0 : fighter.Fight.StartTime.GetUnixTimeStamp(),
                                fighter.Fight.ActiveIdols.Select(x => x.GetNetworkIdol()),
                                fighter.SpellHistory.GetCooldowns(),
                                (sbyte)fighter.SummonedCount,
                                (sbyte)fighter.BombsCount,
                                slaves.Select(x => new GameFightResumeSlaveInfo(x.Id, x.SpellHistory.GetCooldowns(), (sbyte)x.SummonedCount, (sbyte)x.BombsCount))));
            }
            else
            {
                client.Send(new GameFightResumeMessage(
                                fighter.Fight.GetBuffs().Select(entry => entry.GetFightDispellableEffectExtendedInformations()),
                                fighter.Fight.GetTriggers().Select(entry => entry.GetGameActionMark(fighter)),
                                fighter.Fight.TimeLine.RoundNumber,
                                !fighter.Fight.IsStarted ? 0 : fighter.Fight.StartTime.GetUnixTimeStamp(),
                                fighter.Fight.ActiveIdols.Select(x => x.GetNetworkIdol()),
                                fighter.SpellHistory.GetCooldowns(),
                                (sbyte)fighter.SummonedCount,
                                (sbyte)fighter.BombsCount));
            }
        }
예제 #8
0
        public short CalculateEarnedHonor(CharacterFighter character)
        {
            if (Draw)
            {
                return(0);
            }

            if (character.OpposedTeam.AlignmentSide == AlignmentSideEnum.ALIGNMENT_NEUTRAL)
            {
                return(0);
            }

            var winnersLevel   = (double)Winners.GetAllFightersWithLeavers <CharacterFighter>().Sum(entry => entry.Level);
            var losersLevel    = (double)Losers.GetAllFightersWithLeavers <CharacterFighter>().Sum(entry => entry.Level);
            var maxLosersLevel = winnersLevel + 15;

            var delta = Math.Floor(Math.Sqrt(character.Level) * 10 * ((losersLevel > maxLosersLevel ? maxLosersLevel : losersLevel) / winnersLevel));

            if (Losers == character.Team)
            {
                delta = -delta;
            }

            return((short)delta);
        }
        private ControlableMonsterFighter CreateSummon(CharacterFighter master)
        {
            MonsterRecord template = MonsterRecord.GetMonster(this.Effect.DiceMin);
            sbyte         gradeId  = (sbyte)(template.GradeExist(this.SpellLevel.Grade) ? this.SpellLevel.Grade : template.LastGrade().Id);

            return(new ControlableMonsterFighter(this.Source.Team, template, gradeId, master, this.CastPoint.CellId));
        }
예제 #10
0
 public void ToggleReady(CharacterFighter actor, bool ready = true)
 {
     if (this.m_started)
     {
         if (ready && this.m_fighters.Contains(actor))
         {
             this.m_fighters.Remove(actor);
         }
         else
         {
             if (!ready)
             {
                 this.m_fighters.Add(actor);
             }
         }
         if (this.m_fighters.Count == 0)
         {
             if (this.m_timer != null)
             {
                 this.m_timer.Stop();
             }
             this.NotifySuccess();
         }
     }
 }
예제 #11
0
파일: FightPvT.cs 프로젝트: Mixi59/Stump
        protected override void SendGameFightJoinMessage(CharacterFighter fighter)
        {
            var timer = IsStarted ? 0 : (int)GetPlacementTimeLeft(fighter).TotalMilliseconds / 100;

            ContextHandler.SendGameFightJoinMessage(fighter.Character.Client, CanCancelFight(),
                                                    (fighter.Team == ChallengersTeam && IsAttackersPlacementPhase) || (fighter.Team == DefendersTeam && IsDefendersPlacementPhase),
                                                    IsStarted, timer, FightType);
        }
예제 #12
0
        protected override void OnPlayerReadyToLeave(CharacterFighter characterFighter)
        {
            base.OnPlayerReadyToLeave(characterFighter);

            if (characterFighter.Character.ArenaParty != null)
            {
                characterFighter.Character.LeaveParty(characterFighter.Character.ArenaParty);
            }
        }
예제 #13
0
        public Leukide(Fighter source, SpellLevelRecord level, MapPoint castPoint, bool criticalHit) : base(source, level, castPoint, criticalHit)
        {
            this.Owner = (CharacterFighter)source;

            foreach (var enemy in this.Owner.OposedTeam().GetFighters())
            {
                enemy.OnDamageTaken += this.Enemy_OnDamageTaken;
            }
        }
예제 #14
0
        public short CalculateEarnedDishonor(CharacterFighter character)
        {
            if (Draw)
            {
                return(0);
            }

            return(character.OpposedTeam.AlignmentSide != AlignmentSideEnum.ALIGNMENT_NEUTRAL ? (short)0 : (short)1);
        }
예제 #15
0
        private void SynchronizeSequence(CharacterFighter characterFighter)
        {
            List <NetworkMessage> messages = new List <NetworkMessage>();

            messages.Add(characterFighter.GetFighterStatsListMessage());
            messages.Add(this.GetGameFightSynchronizeMessage());

            this.SendSequence(SequenceTypeEnum.SEQUENCE_TURN_START, messages, 70);
        }
예제 #16
0
        public static SummonedFighter MakeControlableBrained(CharacterFighter source, ControlableMonsterFighter target)
        {
            target.Die(source);

            SummonedFighter fighter = new SummonedFighter(target.Template, target.GradeId, source, target.Team, target.CellId);

            source.Fight.AddSummon(fighter);

            return(fighter);
        }
예제 #17
0
        private void OnFightEnded(Character character, CharacterFighter fighter)
        {
            if (!(fighter.Fight is FightPvM))
            {
                return;
            }

            var count = fighter.OpposedTeam.Fighters.OfType <MonsterFighter>().Count(x => x.IsDead() && x.Monster.Template == Monster);

            Completion += count;
        }
예제 #18
0
 public CompanionFighter(CompanionRecord template, CharacterFighter master, FightTeam team)
     : base(team)
 {
     this.Template = template;
     this.Master = master;
     this.Spells = Template.GetSpellItems(Master.Client.Character);
     this.Shortcuts = GenerateShortcuts();
     if (this.Template.StartingSpellLevelId != 0)
     this.AutoCastSpell = SpellLevelRecord.GetLevel(Template.StartingSpellLevelId);
     this.ReadyToFight = true;
 }
예제 #19
0
 public void ToggleReady(CharacterFighter fighter)
 {
     fighter.ReadyToSee = true;
     if (m_fight.GetAllCharacterFighters(true).FindAll(x => x.Available).All(x => x.ReadyToSee))
     {
         // Action
         m_fight.OnCharacterFighters(x => x.Character.FighterInstance.ReadyToSee = false);
         m_timout_timer.Stop();
         m_action();
     }
 }
예제 #20
0
 public void ToggleReady(CharacterFighter fighter)
 {
     fighter.ReadyToSee = true;
     if (m_fight.GetAllCharacterFighters(true).FindAll(x =>x.Available).All(x => x.ReadyToSee))
     {
         // Action
         m_fight.OnCharacterFighters(x => x.Character.FighterInstance.ReadyToSee = false);
         m_timout_timer.Stop();
         m_action();
     }
 }
예제 #21
0
 public static void HandleGameContextKickMessage(WorldClient client, GameContextKickMessage message)
 {
     if (client.Character.IsFighting() && client.Character.Fighter.IsTeamLeader())
     {
         CharacterFighter oneFighter = client.Character.Fight.GetOneFighter <CharacterFighter>(message.targetId);
         if (oneFighter != null && oneFighter.Character.IsFighting() && client.Character.Fight == oneFighter.Character.Fight)
         {
             client.Character.Fight.KickFighter(oneFighter);
         }
     }
 }
예제 #22
0
        public SummonedMonster AddTree(CharacterFighter source, Cell cell)
        {
            var characterSpell = source.Character.Spells.Where((spell) => spell.Template.Id == (int)SpellIdEnum.Tree).First();
            var monsterGrade   = Singleton <MonsterManager> .Instance.GetMonsterGrade((int)MonsterEnum.SADIDA_TREE, characterSpell.CurrentLevel);

            var tree = new SummonedMonster(this.Fight.GetNextContextualId(), this, source, monsterGrade, cell);

            this.AddFighter(tree);
            source.AddSummon(tree);

            return(tree);
        }
예제 #23
0
        public KolizeumFight(Map Map, WorldClient Attacker, WorldClient Defender)
            : base(FightType.TYPE_KOLIZEUM, Map)
        {
            // Init du combat
            var AttFighter = new CharacterFighter(this, Attacker);
            var DefFighter = new CharacterFighter(this, Defender);

            Attacker.AddGameAction(new GameFight(AttFighter, this));
            Defender.AddGameAction(new GameFight(DefFighter, this));

            base.InitFight(AttFighter, DefFighter);
        }
예제 #24
0
        public override bool Apply(Fighter[] targets)
        {
            CharacterFighter source = this.Source as CharacterFighter;

            if (source != null)
            {
                ushort value = this.Effect.RandomizeMinMax();
                source.Character.AddKamas(value);
                source.Character.OnKamasGained(value);
            }

            return(true);
        }
예제 #25
0
 public void AddSummon <T>(T fighter, CharacterFighter source) where T : Fighter, ISummon <CharacterFighter>
 {
     source.Team.AddFighter(fighter);
     if (fighter.InsertInTimeline())
     {
         this.TimeLine.InsertFighter(fighter, TimeLine.Index + 1);
     }
     fighter.Initialize();
     this.Send(new GameActionFightSummonMessage(0, source.Id, new GameFightFighterInformations[] { fighter.GetFightFighterInformations() }));
     if (fighter.InsertInTimeline())
     {
         this.UpdateTimeLine();
     }
 }
예제 #26
0
        public bool Acknowledge(int id, CharacterFighter fighter)
        {
            if (id == Id)
            {
                if (!m_acknowledgedBy.Contains(fighter))
                {
                    m_acknowledgedBy.Add(fighter);
                }

                return(true);
            }

            return(Children.Any(x => x.Acknowledge(id, fighter)));
        }
예제 #27
0
        private void Run(object state)
        {
            if (Started)
            {
                this.cancel();
                return;
            }
            Started = true;
            team1.Remove(p1);
            team2.Remove(p2);
            p1.Send(new BasicNoOperationMessage());
            p2.Send(new BasicNoOperationMessage());
            var Fight = new KolizeumFight(map, p1.Client, p2.Client);

            map.AddFight(Fight);
            foreach (var Player in team1)
            {
                try
                {
                    Player.Send(new BasicNoOperationMessage());
                    Logger.Error("Ini Player " + Player.Name);
                    var Fighter     = new CharacterFighter(Fight, Player.GetClient());
                    var FightAction = new GameFight(Fighter, Fight);
                    Player.Client.AddGameAction(FightAction);
                    Fight.JoinFightTeam(Fighter, Fight.GetTeam1(), false, -1, false);
                }
                catch (Exception e)
                {
                    Logger.Error(e);
                }
            }
            foreach (var Player in team2)
            {
                try
                {
                    Player.Send(new BasicNoOperationMessage());
                    Logger.Error("Ini Player " + Player.Name);
                    //if (Prism.CurrentFight.CanJoin(Team, Client.GetCharacter()))
                    var Fighter     = new CharacterFighter(Fight, Player.GetClient());
                    var FightAction = new GameFight(Fighter, Fight);
                    Player.Client.AddGameAction(FightAction);
                    Fight.JoinFightTeam(Fighter, Fight.GetTeam2(), false, -1, false);
                }
                catch (Exception e)
                {
                    Logger.Error(e);
                }
            }
        }
        private void OnFightEnded(Character character, CharacterFighter fighter)
        {
            if (fighter.Fight.FightType == FightTypeEnum.FIGHT_TYPE_PvM)
            {
                if (fighter.HasWin())
                {
                    if (fighter.Fight.GetChallenges().Any(entry => entry.IsSuccessful))
                    {
                        if (fighter.Fight.RedTeam.GetAllFighters().Sum(entry => entry.Level) < fighter.Fight.GetAllFighters().Sum(entry => entry.Level))
                        {
                            // TODO : 1 challenge
                        }

                        if (fighter.Fight.Map.IsDungeonSpawn)
                        {
                            // TODO : check si c'est un boss
                        }

                        foreach (var item in fighter.Fight.BlueTeam.GetAllFighters <MonsterFighter>())
                        {
                            var criterion = Singleton <AchievementManager> .Instance.TryGetCriterionByMonster(item.Monster.Template);

                            if (criterion != null)
                            {
                                if (this.m_runningCriterions.ContainsKey(criterion))
                                {
                                    this.m_runningCriterions[criterion]++;
                                }
                                else
                                {
                                    this.m_runningCriterions.Add(criterion, 1);
                                }

                                if (!this.ContainsCriterion(criterion.Criterion))
                                {
                                    if (criterion.Eval(this.Owner))
                                    {
                                        this.AddCriterion(criterion);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #29
0
        public CharacterFighter CreateFighter(FightTeam team)
        {
            Look.UnsetAura();
            RefreshOnMapInstance();
            Map.Instance.RemoveClient(Client);
            Client.Send(new GameContextDestroyMessage());
            Client.Send(new GameContextCreateMessage(2));
            Client.Send(new GameFightStartingMessage((sbyte)team.Fight.FightType, 0, 1));
            var fighter = new CharacterFighter(Client, team);

            FighterInstance = fighter;
            if (EquipedCompanion != null)
            {
                var cfighter = new CompanionFighter(EquipedCompanion, fighter, team);
                team.AddFighter(cfighter);
            }
            return(fighter);
        }
        public FightResultPlayer(CharacterFighter fighter, TeamColorEnum winner)
            : base(fighter, winner)
        {
            this.PlayerLevel = fighter.Client.Character.Record.Level;

            if (fighter.Fight is FightPvM && winner == fighter.Team.TeamColor)
            {
                GeneratePVMLoot();
            }
            if (fighter.Fight is FightArena && winner == fighter.Team.TeamColor)
            {
                GenerateArenaLoot();
            }

            // if (fighter.Fight is FightAgression && winner == fighter.Team.TeamColor)
            {
                // add honor
            }
        }
예제 #31
0
        public FightResultPlayer(CharacterFighter fighter, TeamColorEnum winner)
            : base(fighter, winner)
        {
            this.PlayerLevel = fighter.Client.Character.Record.Level;

            if (fighter.Fight is FightPvM && winner == fighter.Team.TeamColor)
            {
                GeneratePVMLoot();
            }
            if (fighter.Fight is FightArena && winner == fighter.Team.TeamColor)
            {
                GenerateArenaLoot();
            }

            // if (fighter.Fight is FightAgression && winner == fighter.Team.TeamColor)
            {
                // add honor
            }
        }
예제 #32
0
파일: PetItem.cs 프로젝트: Mixi59/Stump
        private void OnFightEnded(Character character, CharacterFighter fighter)
        {
            if (PetTemplate == null)
            {
                return;
            }

            bool update = false;

            if (!fighter.Fight.IsDeathTemporarily && fighter.Fight.Losers == fighter.Team && IsEquiped())
            {
                LifePoints--;
                update = true;
            }

            if (fighter.Fight is FightPvM fightPvM)
            {
                foreach (var monster in fightPvM.MonsterTeam.Fighters.OfType <MonsterFighter>().Where(x => x.IsDead()))
                {
                    var food = PetTemplate.Foods.FirstOrDefault(x => x.FoodType == FoodTypeEnum.MONSTER && x.FoodId == monster.Monster.Template.Id);

                    if (food != null)
                    {
                        if (IncreaseCreatureKilledCount(monster.Monster.Template) % food.FoodQuantity == 0)
                        {
                            AddBonus(food);
                        }

                        Invalidate();
                        update = true;
                    }
                }
            }


            if (update && LifePoints > 0)
            {
                Owner.Inventory.RefreshItem(this);
            }

            UpdateCorpulence();
        }
        public short CalculateEarnedDishonor(CharacterFighter character)
        {
            short result;

            if (base.Draw)
            {
                result = 0;
            }
            else
            {
                if (character.OpposedTeam.AlignmentSide != AlignmentSideEnum.ALIGNMENT_NEUTRAL)
                {
                    result = 0;
                }
                else
                {
                    result = 1;
                }
            }
            return(result);
        }
예제 #34
0
 public CharacterFighter CreateFighter(FightTeam team)
 {
     Look.UnsetAura();
     RefreshOnMapInstance();
     Map.Instance.RemoveClient(Client);
     Client.Send(new GameContextDestroyMessage());
     Client.Send(new GameContextCreateMessage(2));
     Client.Send(new GameFightStartingMessage((sbyte)team.Fight.FightType, 0, 1));
     var fighter = new CharacterFighter(Client, team);
     FighterInstance = fighter;
     if (EquipedCompanion != null)
     {
         var cfighter = new CompanionFighter(EquipedCompanion, fighter, team);
         team.AddFighter(cfighter);
     }
     return fighter;
 }