Salut à tous , ça fait longtemps que je n'ai pas posé de problème sur Cadernis mais là je reviens avec un truc un peu plus compliqué .D'ailleurs , comme l'indique le titre , mon bot prends beaucoup de temps avec de réagir après le début de son tour . En premier temps , j'ai pensé que c'était à cause de l'HashFunc mais j'ai remarqué que les paquets de combats n'étaient même pas envoyés pour que le serveur puisse les analyser et j'ai fini par conclure que le problème venait de mon bot .Pour le moment , je crois que ce sont les multiples calcules que je fais avec le pathfinder qui causent ce retard ainsi que les boucles foreach.
Voici mes fonctions Get qui me servent à acquérir les infos concernant les combattants
Cliquez pour révéler
Cliquez pour masquer
public List<FighterModel> GetEnnemies(int FighterId)
{
if (Defenders.Any(fighter => fighter.ContextualId == FighterId))
return Challengers;
else if (Challengers.Any(fighter => fighter.ContextualId == FighterId))
return Defenders;
mHost.logger.Log("le joueur " + FighterId + " ne figure pas dans la liste des combatants , il se peut qu'il soit un spectateur");
return null;
}
public List<FighterModel> GetTeam(int FighterId)
{
if (Defenders.Any(fighter => fighter.ContextualId == FighterId))
return Defenders;
else if (Challengers.Any(fighter => fighter.ContextualId == FighterId))
return Challengers;
mHost.logger.Log("le joueur " + FighterId + " ne figure pas dans la liste des combatants , il se peut qu'il soit un spectateur");
return null;
}
public List<short> GetEnnemiesCells(int FighterId)
{
if (Defenders.Any(fighter => fighter.ContextualId == FighterId))
return (List<short>)Challengers.Select(fighter => fighter.CellId);
else if (Challengers.Any(fighter => fighter.ContextualId == FighterId))
return (List<short>)Defenders.Select(fighter => fighter.CellId);
mHost.logger.Log("le joueur " + FighterId + " ne figure pas dans la liste des combatants , il se peut qu'il soit un spectateur");
return null;
}
public List<short> GetTeamCells(int FighterId)
{
if (Defenders.Any(fighter => fighter.ContextualId == FighterId))
return (List<short>)Defenders.Select(fighter => fighter.CellId);
else if (Challengers.Any(fighter => fighter.ContextualId == FighterId))
return (List<short>)Challengers.Select(fighter => fighter.CellId);
mHost.logger.Log("le joueur " + FighterId + " ne figure pas dans la liste des combatants , il se peut qu'il soit un spectateur");
return null;
}
public List<FighterModel> GetEnnemies()
{
if (playedFighter.PlayerFightInformations.TeamSide == TeamEnum.TEAM_CHALLENGER)
return Defenders;
else if ((playedFighter.PlayerFightInformations.TeamSide == TeamEnum.TEAM_DEFENDER))
return Challengers;
return new List<FighterModel>();
}
public List<FighterModel> GetTeam()
{
if (playedFighter.PlayerFightInformations.TeamSide == TeamEnum.TEAM_CHALLENGER)
return Challengers;
else if ((playedFighter.PlayerFightInformations.TeamSide == TeamEnum.TEAM_DEFENDER))
return Defenders;
return null;
}
public IEnumerable<short> GetEnnemiesCells()
{
if (playedFighter.PlayerFightInformations.TeamSide == TeamEnum.TEAM_CHALLENGER)
return Defenders.Select(fighter => fighter.CellId);
else if ((playedFighter.PlayerFightInformations.TeamSide == TeamEnum.TEAM_DEFENDER))
return Challengers.Select(fighter => fighter.CellId);
return null;
}
public IEnumerable<short> GetTeamCells()
{
if (playedFighter.PlayerFightInformations.TeamSide == TeamEnum.TEAM_CHALLENGER) {
return (List<short>)Challengers.Select (fighter => fighter.CellId);
}
else if ((playedFighter.PlayerFightInformations.TeamSide == TeamEnum.TEAM_DEFENDER))
return (List<short>)Defenders.Select(fighter => fighter.CellId);
return null;
}
public FighterModel GetNearestEnnemie()
{
return GetEnnemies ().OrderBy (ennemie => finder.matrix [ennemie.CellId].DistanceTo (finder.matrix [playedFighter.PlayerBaseInformations.CellId])).FirstOrDefault();
}
public FighterModel GetFarthestEnnemie()
{
return GetEnnemies ().OrderBy (ennemie => finder.matrix [ennemie.CellId].DistanceTo (finder.matrix [playedFighter.PlayerBaseInformations.CellId])).LastOrDefault();
}
Voici le lancement de sorts (calculs , portée , distance ...etc) :
Cliquez pour révéler
Cliquez pour masquer
public bool Attack(SpellData spell)
{
if (isInRange(spell , FocusedFighter.CellId))
{
int neededPm = GetNeededMp(spell, FocusedFighter.CellId);
if (neededPm > Player.PlayerFightInformations.Stats.movementPoints)
{
mBrain.Movement.sink();
return false;
}
mBrain.Movement.sink(neededPm);
LaunchSpell((ushort)spell.SpellId, FocusedFighter.CellId);
return true;
}
return false;
}
public List<SpellData> GetAttackingSpell(int priority = 0)
{
if (UsableSpells.Count > 0 && UsableSpells.Any(SpellData => SpellData.Cible == Frames.Game.World.Fight.CibleEnum.ENNEMY))
return UsableSpells.Where(SpellData => SpellData.Cible == Frames.Game.World.Fight.CibleEnum.ENNEMY).ToList().OrderByDescending(spell => spell.Priority).ToList().Select(spell => spell.Spell).ToList();
mBrain.Fight.mHost.logger.Log("Aucun sort d'attaque n'est configuré !", Common.Default.Loging.LogLevelEnum.Error);
return null;
}
public bool isInRange(SpellData spell , int CellId)
{
if (!mBrain.Fight.finder.matrix.Any(cell => cell.Key == CellId))
return false;
if(mBrain.Fight.finder.matrix[Player.PlayerBaseInformations.CellId].ManhattanDistanceTo(mBrain.Fight.finder.matrix[CellId]) < spell.SpellLevel.Range)
{
return true;
}
return false;
}
public int GetNeededMp(SpellData spell , int CellId) // nombre de pm pour atteindre la portée du sort
{
if (isInRange(spell, CellId) || !mBrain.Fight.finder.matrix.Any(cell => cell.Key == CellId))
return -1;
return (int)Fight.finder.matrix[Player.PlayerBaseInformations.CellId].ManhattanDistanceTo(Fight.finder.matrix[FocusedFighter.CellId]) - (int)spell.SpellLevel.Range;
}
public int GetNeededPMToFocusedFighter() //nombre de PM pour atteindre un player
{
if (mBrain.Fight.finder.matrix[Player.PlayerBaseInformations.CellId].GetConnectedCells().Any(id => id == FocusedFighter.CellId) || !mBrain.Fight.finder.matrix.Any(cell => cell.Key == FocusedFighter.CellId))
return -1;
return (int)Fight.finder.matrix[Player.PlayerBaseInformations.CellId].ManhattanDistanceTo(Fight.finder.matrix[FocusedFighter.CellId]);
}
public bool CanUseSpell(SpellData spell)
{
if (Player.PlayerFightInformations.Stats.actionPoints < spell.SpellLevel.ApCost)
return false;
else if (isInRange(spell , FocusedFighter.CellId))
{
int needpm = GetNeededMp(spell, FocusedFighter.CellId);
if (needpm > Player.PlayerFightInformations.Stats.movementPoints)
return false;
else
return true;
}
return true;
}
Ainsi que j'utilise une classe Shape (rectangle , losange ..) pour définir la zone d'un sort .
Désolé , si je demande beaucoup de votre part :mrgreen: et merci :) .
PS : j'utilise des new Task(() =>) pour chaque action .
Edit : j'ai effectué quelques test pour localiser la source du problème .Ainsi , j'ai éliminer temporairement la partie Mouvement dans un combat et j'ai laissé le placement et le lancement des sorts et la résultat était magnifique , la je vais analyser la partie mouvement pour voir qu'est ce qui cloche dedans . #Skyzo
Edit : Pfff , je sais pas comment , mais j'ai éliminer plusieurs calculs facultatifs et la vitesse de combat est devenue même excessive ce qui m'a poussé a faire des threads.sleep vu que le serveur ne répondait pas à toute mes requêtes . #Sorry