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 !"); } }
public void ChangePlayerPlace(Fighter fighter, int cellID) { if (fighter.Team.PlacementsPlaces.Contains(cellID)) { if (!fighter.Team.HaveFightersOnThisPlace(cellID) && !fighter.IsReady) { fighter.CellID = cellID; this.Send("GIC|" + fighter.ID + ";" + cellID + ";1"); } else { fighter.Send("BN"); } } }
public void UseWeapon(Fighter fighter, int cellID) { if (fighter.Character.Items.GetItemAtPos(1) != null) { fighter.Send("GAS" + fighter.ID); Database.Records.WorldItemRecord item = fighter.Character.Items.GetItemAtPos(1); bool failedHit = false; if (Utilities.Basic.Rand(0, item.GetTemplate.Engine.TauxEC) == 1) { failedHit = true; } if (!failedHit) { if (fighter.CurrentAP >= item.Engine.CostInPa) { fighter.CurrentAP -= item.Engine.CostInPa; bool criticatHit = false; int tauxCC = item.Engine.TauxCC - fighter.Character.Stats.CriticalBonus.Total; if (tauxCC < 2) tauxCC = 2; if (Utilities.Basic.Rand(0, tauxCC) == 1) { criticatHit = true; } if (fighter.Client.Action.GodMode) { criticatHit = true; } this.Send("GA;303;" + fighter.ID + ";" + cellID); List<Fighter> targets = GetFighterInZoneForWeapon(fighter, item.GetTemplate.Type, cellID); foreach (Fighter target in targets) { foreach (World.Handlers.Items.Effect effect in item.Engine.Effects) { if (item.Engine.IsWeaponEffect(effect.ID)) { int baseDamage = 0; if (criticatHit) { this.Send("GA;301;" + fighter.ID + ";"); baseDamage = Utilities.Basic.Rand(effect.Des.Min, effect.Des.Max); } else { baseDamage = Utilities.Basic.Rand(effect.Des.Min, effect.Des.Max); } if (GetElementForEffect(effect.ID) != 0) { int damages = FightSpellEffects.RandomDamages(baseDamage, fighter, GetElementForEffect(effect.ID)); target.TakeDamages(target.ID, -damages, GetElementForEffect(effect.ID)); } else if(GetStealElementForEffect(effect.ID) != 0) { int damages = FightSpellEffects.RandomDamages(baseDamage, fighter, GetStealElementForEffect(effect.ID)); int stealedLife = (int)Math.Truncate((double)(damages / 2)); target.TakeDamages(target.ID, -damages, GetStealElementForEffect(effect.ID)); fighter.Heal(fighter.ID, stealedLife, GetStealElementForEffect(effect.ID)); } } } } } this.Send("GA;102;" + fighter.ID + ";" + fighter.ID + ",-" + item.Engine.CostInPa); } this.Send("GAF0|" + fighter.ID); } }
public void ShowFightToClient(Fighter fighter) { this.Send("GM|+" + fighter.DisplayPattern); switch (this.FightType) { case Enums.FightTypeEnum.Challenge: fighter.Send("GJK2|1|1|0|0|0"); break; case Enums.FightTypeEnum.PvM: fighter.Send("GJK2|0|1|0|29999|4"); break; case Enums.FightTypeEnum.Kolizeum: case Enums.FightTypeEnum.Agression: fighter.Send("GJK2|0|1|0|29999|1"); break; } fighter.Send("GP" + this.DisplayPatternPlace + "|" + fighter.Team.ID); fighter.Send("GM" + this.DisplayPatternFighters); }
public void QuitBattle(Fighter fighter, bool loop = false, bool abandon = false) { this.Send("GM|-" + fighter.ID); if (fighter.IsHuman) { if (FightType == Enums.FightTypeEnum.PvM) { fighter.Character.CurrentLife = 1; World.Network.World.GoToMap(fighter.Client, fighter.Client.Character.SaveMap, fighter.Client.Character.SaveCell); } else if (abandon && FightType == Enums.FightTypeEnum.Agression) { fighter.Client.Character.FactionHonor -= 250; fighter.Client.Action.SystemMessage("Vous avez perdu <b>250</b> points d'honneur suite a votre abandon"); } else if (FightType == Enums.FightTypeEnum.Kolizeum) { fighter.Client.Action.KolizeumMessage("Votre combat est terminer, vos points de vie on ete remis au maximum !"); fighter.Character.CurrentLife = fighter.Character.Stats.MaxLife; World.Network.World.GoToMap(fighter.Client, fighter.Client.Action.KolizeumLastMapID, fighter.Client.Action.KolizeumLastCellID); } } fighter.Team.Fighters.Remove(fighter); switch (this.State) { case FightState.PlacementsPhase: if (!IsAvailableBattle() && !loop) { foreach (Fighter otherFighter in Fighters) { /* Loop is a true, for prevent stack overflow exception */ this.QuitBattle(otherFighter, true); } this.EndFightEngine(); this.Map.RemoveFightOnMap(this); } break; case FightState.Fighting: if (!IsAvailableBattle() && !loop) { foreach (Fighter otherFighter in Fighters) { /* Loop is a true, for prevent stack overflow exception */ this.QuitBattle(otherFighter, true); } this.EndFightResult(); this.RedTeam.Fighters.Clear(); this.BlueTeam.Fighters.Clear(); this.EndFightEngine(); this.Map.RemoveFightOnMap(this); this.TimeLine.RemixTimeLine(); } break; } fighter.Buffs.ForEach(x => x.BuffRemoved()); fighter.Buffs.Clear(); if (fighter.IsHuman) { fighter.Character.Fighter = null; } fighter.Send("GV"); }
public void PlayerWantMove(Fighter fighter, string path) { if (this.State == FightState.Fighting && this.TimeLine.CurrentFighter.ID == fighter.ID) { Engines.Pathfinding pathfinding = new Engines.Pathfinding(path, this.Map.Map, fighter.CellID, fighter.Dir); int distance = pathfinding.GetDistanceBetween(fighter.CellID, pathfinding.Destination); if (fighter.CurrentMP >= distance) { string remakePath = pathfinding.GetStartPath + pathfinding.RemakePath(); if (fighter.ByWearFighter != null) { fighter.UnWear(); } fighter.Send("GAS" + fighter.ID); this.Send("GA0;1;" + fighter.ID + ";" + remakePath); /* Remove MP */ fighter.CurrentMP -= distance; fighter.NextCell = pathfinding.Destination; fighter.NextDir = pathfinding.NewDirection; } else { fighter.Send("BN"); } } else { fighter.Send("BN"); } }
public void PlayerEndMove(Fighter fighter) { if (this.State == FightState.Fighting && this.TimeLine.CurrentFighter.ID == fighter.ID) { if (fighter.NextCell != -1 && fighter.NextDir != -1) { int distance = this.Map.PathfindingMaker.GetDistanceBetween(fighter.CellID, fighter.NextCell); this.Send("GA;129;" + fighter.ID + ";" + fighter.ID + ",-" + distance); fighter.Send("GAF2|" + fighter.ID); /* Set new position */ fighter.CellID = fighter.NextCell; fighter.Dir = fighter.NextDir; if (fighter.WearedFighter != null) { fighter.WearedFighter.CellID = fighter.CellID; fighter.WearedFighter.Dir = fighter.Dir; } /* Reset next position result for next move */ fighter.NextCell = -1; fighter.NextDir = -1; fighter.CurrentUsedPmThisTurn += distance; this.CheckZombieChallenge(fighter); CheckTraps(fighter); } } else { fighter.Send("BN"); } }