Example #1
0
        public void CastSpell(Fighter fighter, Game.Spells.WorldSpell spell, int level, int cellid)
        {
            Engines.Spells.SpellLevel spellLevel = spell.Template.Engine.GetLevel(level);

            if (fighter.CurrentAP >= spellLevel.CostPA)
            {
                if (!fighter.CanCastSpell(spellLevel.Engine.Spell.ID))
                {
                    fighter.Client.Action.SystemMessage("Le cooldown du sort n'est pas encore lever !");
                    return;
                }

                fighter.Send("GAS" + fighter.ID);
                fighter.CurrentAP -= spellLevel.CostPA;

                bool failedHit = false;

                if (Utilities.Basic.Rand(0, spellLevel.TauxEC) == 1)
                {
                    failedHit = true;
                }

                if (!failedHit)
                {
                    this.Send("GA;300;" + fighter.ID + ";" + spell.Template.ID + ","
                        + cellid + "," + spell.Template.SpriteID + "," + level + "," + spell.Template.SpriteInfos);

                    bool criticatHit = false;
                    int tauxCC = spellLevel.TauxCC - fighter.Stats.CriticalBonus.Total;
                    if (tauxCC < 2) tauxCC = 2;

                    if (Utilities.Basic.Rand(0, tauxCC) == 1)
                    {
                        criticatHit = true;
                    }

                    if (fighter.IsHuman)
                    {
                        if (fighter.Client.Action.GodMode)
                        {
                            criticatHit = true;
                        }
                    }

                    if (criticatHit && spellLevel.Effects.FindAll(x => x.Effect != Enums.SpellsEffects.DoNothing && x.Effect != Enums.SpellsEffects.None).Count > 0)
                    {
                        this.Send("GA;301;" + fighter.ID + ";" + spell.SpellID);
                        this.ApplyEffects(fighter, spellLevel, spellLevel.Effects, cellid, criticatHit, false);
                    }
                    else
                    {
                        this.ApplyEffects(fighter, spellLevel, spellLevel.CriticalEffects, cellid, criticatHit, false);
                    }

                    //Apply new cooldown (FIXED IN THE 1.0.2.1)
                    if (spellLevel.TurnNumber > 0)
                    {
                        if (!fighter.Cooldowns.ContainsKey(spellLevel.Engine.Spell.ID))
                        {
                            fighter.Cooldowns.Add(spellLevel.Engine.Spell.ID, new FightSpellCooldown(spellLevel.Engine.Spell.ID, spellLevel.TurnNumber));
                        }
                    }
                }
                else
                {
                    this.Send("GA;302;" + fighter.ID + ";" + spell.SpellID);
                    if (spellLevel.ECCanEndTurn)
                    {
                        FinishTurnRequest(fighter);
                    }
                }

                this.Send("GA;102;" + fighter.ID + ";" + fighter.ID + ",-" + spellLevel.CostPA);
                fighter.Send("GAF0|" + fighter.ID);
            }
            else
            {
                fighter.Client.Action.SystemMessage("Le nombre de PA requis est supérieur aux votre actuellement !");
            }
        }