Exploit dans mon code

Exploit dans mon code - Java - Programmation

Marsh Posté le 12-03-2013 à 22:05:51    

So basically I made this code for my game wich is for the fight stage..
This is the code the allow the player to be able to leave the fight, but once he leave the fight in type _PVM, the game think that the player is still in it so at the end at player still receive the ammount of experience for the combat when he shouldn't be getting it..
 
I know the text in english are not perfect -_- I'm french okay ?
 

Code :
  1. public void leftFight(Personnage perso, Personnage target)
  2. {
  3.  if(perso == null)return;
  4.  Fighter F = this.getFighterByPerso(perso);
  5.  Fighter T = null;
  6.  if(target != null) T = this.getFighterByPerso(target);
  7.  if(ElinkEmu.CONFIG_DEBUG)
  8.  {
  9.   if(target != null && T != null)
  10.   {
  11.    GameServer.addToLog(perso.get_name()+" kick "+T.getPersonnage().get_name());
  12.   }else
  13.   {
  14.    GameServer.addToLog(perso.get_name()+" has left the fight" );
  15.   }
  16.  }
  17.  if(F != null)
  18.  {
  19.   switch(_type)
  20.   {
  21.    case Constants.FIGHT_TYPE_CHALLENGE: //challenges
  22.    case Constants.FIGHT_TYPE_KOLI: //Arena
  23.    case Constants.FIGHT_TYPE_AGRESSION: //PVP
  24.    case Constants.FIGHT_TYPE_PVM: //PVM
  25.    case Constants.FIGHT_TYPE_PVT: //Perco
  26.    case Constants.FIGHT_TYPE_CONQUETE: //Prism
  27.     if(_state >= Constants.FIGHT_STATE_ACTIVE)
  28.     {
  29.      if(_ordreJeu.size() == 0){
  30.       endTurn();
  31.      }else if(_ordreJeu.get(_curPlayer).getGUID() == F.getGUID())
  32.      {
  33.       endTurn();
  34.      }
  35.      onFighterDie(F, T);
  36.      boolean StillInFight = false;
  37.      if(_type == Constants.FIGHT_TYPE_CHALLENGE || _type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_PVT|| _type == Constants.FIGHT_TYPE_KOLI)
  38.      {
  39.       StillInFight = verifyStillInFightTeam(F.getGUID());
  40.      }else
  41.      {
  42.       StillInFight = verifyStillInFight();
  43.      }
  44.      if(!StillInFight) //If it stops here nobody left in the fight and the team
  45.      {
  46.       //puts an end to fighting
  47.       verifIfTeamAllDead();
  48.      }else
  49.      {
  50.       F.setLeft(true);
  51.       SocketManager.GAME_SEND_ERASE_ON_MAP_TO_MAP(_map, F.getGUID());
  52.       Personnage P = F.getPersonnage();
  53.       P.set_duelID(-1);
  54.       P.set_ready(false);
  55.       //P.fullPDV(); //Put back life of the player when canceling a challenge.
  56.       P.set_fight(null);
  57.       P.setSitted(false);
  58.       P.set_away(false);
  59.       if(_type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_PVM || _type == Constants.FIGHT_TYPE_PVT|| _type == Constants.FIGHT_TYPE_KOLI)
  60.       {
  61.        /**Energy**/
  62.        int EnergyLoos = Formulas.getLoosEnergy(P.get_lvl(), _type==1, _type==5);
  63.        int Energy = P.get_energy() - EnergyLoos;
  64.        if(Energy < 0) Energy = 0;
  65.        P.set_energy(Energy);
  66.        if(P.isOnline())
  67.         SocketManager.GAME_SEND_Im_PACKET(P, "034;"+EnergyLoos);
  68.        /**Energy**/
  69.        if(_type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_CONQUETE)
  70.        {
  71.         int honor = P.get_honor()-500;
  72.         if(honor < 0) honor = 0;
  73.         P.set_honor(honor);
  74.         if(P.isOnline())
  75.          SocketManager.GAME_SEND_Im_PACKET(P, "076;"+honor);
  76.        }
  77.        try
  78.        {
  79.         Thread.sleep(1000);
  80.        }catch(Exception E){};
  81.        if(Energy == 0)
  82.        {
  83.         P.set_Ghosts();
  84.        }else
  85.        {
  86.         P.warpToSavePos();
  87.         P.set_PDV(1);
  88.        }
  89.       }
  90.       if(P.isOnline())
  91.       {
  92.        try
  93.        {
  94.         Thread.sleep(200);
  95.        }catch(Exception E){};
  96.        SocketManager.GAME_SEND_GV_PACKET(P);
  97.        P.refreshMapAfterFight();
  98.       }
  99.      }
  100.     }else if(_state == Constants.FIGHT_STATE_PLACE)
  101.     {
  102.      boolean isValid1 = false;
  103.      if(T != null)
  104.      {
  105.       if(_init0 != null &&_init0.getPersonnage() != null)
  106.       {
  107.        if(F.getPersonnage().get_GUID() == _init0.getPersonnage().get_GUID())
  108.        {
  109.         isValid1 = true;
  110.        }
  111.       }
  112.       if(_init1 != null &&_init1.getPersonnage() != null)
  113.       {
  114.        if(F.getPersonnage().get_GUID() == _init1.getPersonnage().get_GUID())
  115.        {
  116.         isValid1 = true;
  117.        }
  118.       }
  119.      }
  120.      if(isValid1) //Whoever does the action start the fight and leave another character
  121.      {
  122.       if((T.getTeam() == F.getTeam()) && (T.getGUID() != F.getGUID()))
  123.       {
  124.        if(ElinkEmu.CONFIG_DEBUG) System.out.println("Kick of : "+T.getPersonnage().get_name());
  125.        SocketManager.GAME_SEND_ON_FIGHTER_KICK(this, T.getPersonnage().get_GUID(), getTeamID(T.getGUID()));
  126.        if(_type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_CHALLENGE || _type == Constants.FIGHT_TYPE_PVT|| _type == Constants.FIGHT_TYPE_KOLI) SocketManager.GAME_SEND_ON_FIGHTER_KICK(this, T.getPersonnage().get_GUID(), getOtherTeamID(T.getGUID()));
  127.        Personnage P = T.getPersonnage();
  128.        P.set_duelID(-1);
  129.        P.set_ready(false);
  130.        P.fullPDV();
  131.        P.set_fight(null);
  132.        P.setSitted(false);
  133.        P.set_away(false);
  134.        if(P.isOnline())
  135.        {
  136.         try
  137.         {
  138.          Thread.sleep(200);
  139.         }catch(Exception E){};
  140.         SocketManager.GAME_SEND_GV_PACKET(P);
  141.         P.refreshMapAfterFight();
  142.        }
  143.        //We removes it from the team
  144.        if(_team0.containsKey(T.getGUID()))
  145.        {
  146.         T._cell.removeFighter(T);
  147.         _team0.remove(T.getGUID());
  148.        }
  149.        else if(_team1.containsKey(T.getGUID()))
  150.        {
  151.         T._cell.removeFighter(T);
  152.         _team1.remove(T.getGUID());
  153.        }
  154.        for(Personnage z : _mapOld.getPersos()) FightStateAddFlag(this._mapOld, z);
  155.       }
  156.      }else if(T == null) //Leave it voluntarily so (T = null)
  157.      {
  158.       boolean isValid2 = false;
  159.       if(_init0 != null &&_init0.getPersonnage() != null)
  160.       {
  161.        if(F.getPersonnage().get_GUID() == _init0.getPersonnage().get_GUID())
  162.        {
  163.         isValid2 = true;
  164.        }
  165.       }
  166.       if(_init1 != null &&_init1.getPersonnage() != null)
  167.       {
  168.        if(F.getPersonnage().get_GUID() == _init1.getPersonnage().get_GUID())
  169.        {
  170.         isValid2 = true;
  171.        }
  172.       }
  173.       if(isValid2) //He is going into battle => cancellation of the fight
  174.       {
  175.        for(Fighter f : this.getFighters(F.getTeam2()))
  176.        {
  177.         Personnage P = f.getPersonnage();
  178.         P.set_duelID(-1);
  179.         P.set_ready(false);
  180.         //P.fullPDV();
  181.         P.set_fight(null);
  182.         P.setSitted(false);
  183.         P.set_away(false);
  184.         if(F.getPersonnage().get_GUID() != f.getPersonnage().get_GUID()) //Those who joined the fight go back on the map
  185.         {
  186.          if(P.isOnline())
  187.          {
  188.           try
  189.           {
  190.            Thread.sleep(200);
  191.           }catch(Exception E){};
  192.           SocketManager.GAME_SEND_GV_PACKET(P);
  193.           P.refreshMapAfterFight();
  194.          }
  195.         }else //Whoever did the fight dies loss + honor
  196.         {
  197.          if(_type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_PVM || _type == Constants.FIGHT_TYPE_PVT|| _type == Constants.FIGHT_TYPE_KOLI)
  198.          {
  199.           /**Energy**/
  200.           int EnergyLoos = Formulas.getLoosEnergy(P.get_lvl(), _type==1, _type==5);
  201.           int Energy = P.get_energy() - EnergyLoos;
  202.           if(Energy < 0) Energy = 0;
  203.           P.set_energy(Energy);
  204.           if(P.isOnline())
  205.            SocketManager.GAME_SEND_Im_PACKET(P, "034;"+EnergyLoos);
  206.           /**Energy**/
  207.           if(_type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_CONQUETE)
  208.           {
  209.            int honor = P.get_honor()-500;
  210.            if(honor < 0) honor = 0;
  211.            P.set_honor(honor);
  212.            if(P.isOnline())
  213.             SocketManager.GAME_SEND_Im_PACKET(P, "076;"+honor);
  214.           }
  215.           try
  216.           {
  217.            Thread.sleep(1000);
  218.           }catch(Exception E){};
  219.           if(Energy == 0)
  220.           {
  221.            P.set_Ghosts();
  222.           }else
  223.           {
  224.            P.warpToSavePos();
  225.            P.set_PDV(1);
  226.           }
  227.          }
  228.          if(P.isOnline())
  229.          {
  230.           try
  231.           {
  232.            Thread.sleep(200);
  233.           }catch(Exception E){};
  234.           SocketManager.GAME_SEND_GV_PACKET(P);
  235.           P.refreshMapAfterFight();
  236.          }
  237.         }
  238.        }
  239.        _ticMyTimer_startTime = 0L;
  240.                          _ticMyTimer_endTurn = false;
  241.                          if(_type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_CHALLENGE || _type == Constants.FIGHT_TYPE_PVT|| _type == Constants.FIGHT_TYPE_KOLI)
  242.        {
  243.         for(Fighter f : this.getFighters(F.getOtherTeam()))
  244.         {
  245.          if(f.getPersonnage() == null) continue;
  246.          Personnage P = f.getPersonnage();
  247.          P.set_duelID(-1);
  248.          P.set_ready(false);
  249.          //P.fullPDV();
  250.          P.set_fight(null);
  251.          P.setSitted(false);
  252.          P.set_away(false);
  253.          if(P.isOnline())
  254.          {
  255.           try
  256.           {
  257.            Thread.sleep(200);
  258.           }catch(Exception E){};
  259.           SocketManager.GAME_SEND_GV_PACKET(P);
  260.           P.refreshMapAfterFight();
  261.          }
  262.         }
  263.        }
  264.        _state = 4; //Make sure we do not start the fight
  265.        World.getCarte(_map.get_id()).removeFight(_id);
  266.        SocketManager.GAME_SEND_MAP_FIGHT_COUNT_TO_MAP(World.getCarte(_map.get_id()));
  267.        SocketManager.GAME_SEND_GAME_REMFLAG_PACKET_TO_MAP(this._mapOld,_init0.getGUID());
  268.        if (_type == Constants.FIGHT_TYPE_CONQUETE) {
  269.         String str = _Prisme.getCarte() + "|" + _Prisme.getX() + "|" + _Prisme.getY();
  270.         for (Personnage z : World.getOnlinePersos()) {
  271.          if (z == null)
  272.           continue;
  273.          if (z.get_align() != _Prisme.getalignement())
  274.           continue;
  275.          SocketManager.SEND_CS_SURVIVRE_MESSAGE_PRISME(z, str);
  276.         }
  277.         _Prisme.setInFight(-1);
  278.         _Prisme.setFightID(-1);
  279.         if (perso != null) {
  280.          if (_Prisme != null)
  281.           SocketManager.SEND_CP_INFO_DEFENSEURS_PRISME(perso, getDefenseurs());
  282.         }
  283.         for (Personnage z : World.getCarte((short) _Prisme.getCarte()).getPersos()) {
  284.          if (z == null)
  285.           continue;
  286.          SocketManager.SEND_GM_PRISME_TO_MAP(z.get_compte().getGameThread().get_out(),
  287.            z.get_curCarte());
  288.         }
  289.        }
  290.        if(_type == Constants.FIGHT_TYPE_PVT)
  291.        {
  292.         for(Personnage z : World.getGuild(_guildID).getMembers())
  293.         {
  294.          if(z == null) continue;
  295.          if(z.isOnline())
  296.          {
  297.           SocketManager.GAME_SEND_gITM_PACKET(z, Percepteur.parsetoGuild(z.get_guild().get_id()));
  298.           SocketManager.GAME_SEND_PERCO_INFOS_PACKET(z, F._Perco, "S" );
  299.          }
  300.         }
  301.         _perco.set_inFight((byte)0);
  302.         _perco.set_inFightID((byte)-1);
  303.         _perco.clearDefenseFight();
  304.         for(Personnage z : World.getCarte((short)_perco.get_mapID()).getPersos())
  305.         {
  306.          if(z == null) continue;
  307.          SocketManager.GAME_SEND_MAP_PERCO_GMS_PACKETS(z.get_compte().getGameThread().get_out(), z.get_curCarte());
  308.         }
  309.        }
  310.        if(_type == Constants.FIGHT_TYPE_PVM)
  311.        {
  312.         int align = -1;
  313.         if(_team1.size() >0)
  314.         {
  315.           _team1.get(_team1.keySet().toArray()[0]).getMob().getTemplate().getAlign();
  316.         }
  317.         //Si groupe non fixe
  318.         if(!_mobGroup.isFix())World.getCarte(_map.get_id()).spawnGroup(align, 1, true,_mobGroup.getCellID()); //Respawn group
  319.        }
  320.        _map = null;
  321.        _ordreJeu = null;
  322.       }else //Either he joined the fight => Left to itself
  323.       {
  324.        SocketManager.GAME_SEND_ON_FIGHTER_KICK(this, F.getPersonnage().get_GUID(), getTeamID(F.getGUID()));
  325.        if(_type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_CHALLENGE || _type == Constants.FIGHT_TYPE_PVT|| _type == Constants.FIGHT_TYPE_KOLI) SocketManager.GAME_SEND_ON_FIGHTER_KICK(this, F.getPersonnage().get_GUID(), getOtherTeamID(F.getGUID()));
  326.        Personnage P = F.getPersonnage();
  327.        P.set_duelID(-1);
  328.        P.set_ready(false);
  329.        //P.fullPDV();
  330.        P.set_fight(null);
  331.        P.setSitted(false);
  332.        P.set_away(false);
  333.        if(_type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_PVM || _type == Constants.FIGHT_TYPE_PVT|| _type == Constants.FIGHT_TYPE_KOLI)
  334.        {
  335.         /**Energy**/
  336.         int EnergyLoos = Formulas.getLoosEnergy(P.get_lvl(), _type==1, _type==5);
  337.         int Energy = P.get_energy() - EnergyLoos;
  338.         if(Energy < 0) Energy = 0;
  339.         P.set_energy(Energy);
  340.         if(P.isOnline())
  341.          SocketManager.GAME_SEND_Im_PACKET(P, "034;"+EnergyLoos);
  342.         /**Energy**/
  343.         if(_type == Constants.FIGHT_TYPE_AGRESSION || _type == Constants.FIGHT_TYPE_CONQUETE)
  344.         {
  345.          int honor = P.get_honor()-500;
  346.          if(honor < 0) honor = 0;
  347.          P.set_honor(honor);
  348.          if(P.isOnline())
  349.           SocketManager.GAME_SEND_Im_PACKET(P, "076;"+honor);
  350.         }
  351.         try
  352.         {
  353.          Thread.sleep(1000);
  354.         }catch(Exception E){};
  355.         if(Energy == 0)
  356.         {
  357.          P.set_Ghosts();
  358.         }else
  359.         {
  360.          P.warpToSavePos();
  361.          P.set_PDV(1);
  362.         }
  363.        }
  364.        if(P.isOnline())
  365.        {
  366.         try
  367.         {
  368.          Thread.sleep(200);
  369.         }catch(Exception E){};
  370.         SocketManager.GAME_SEND_GV_PACKET(P);
  371.         P.refreshMapAfterFight();
  372.        }
  373.        //On le supprime de la team
  374.        if(_team0.containsKey(F.getGUID()))
  375.        {
  376.         F._cell.removeFighter(F);
  377.         _team0.remove(F.getGUID());
  378.        }
  379.        else if(_team1.containsKey(F.getGUID()))
  380.        {
  381.         F._cell.removeFighter(F);
  382.         _team1.remove(F.getGUID());
  383.        }
  384.        for(Personnage z : _mapOld.getPersos()) FightStateAddFlag(this._mapOld, z);
  385.       }
  386.      }
  387.     }else
  388.     {
  389.      if(ElinkEmu.CONFIG_DEBUG) GameServer.addToLog("Combat phase unmanaged, type of combat:"+_type+" T:"+T+" F:"+F);
  390.     }
  391.    break;
  392.    default:
  393.     if(ElinkEmu.CONFIG_DEBUG) GameServer.addToLog("Combat phase unmanaged, type of combat:"+_type+" T:"+T+" F:"+F);
  394.    break;
  395.   }
  396.  }else //If character is viewing the fight
  397.  {
  398.   SocketManager.GAME_SEND_GV_PACKET(perso);
  399.   _spec.remove(perso.get_GUID());
  400.   perso.setSitted(false);
  401.   perso.set_fight(null);
  402.   perso.set_away(false);
  403.  }
  404. }


 
And this is the code to verify if the player is still in the fight at the end of the fight..
 

Code :
  1. public boolean verifyStillInFight()//Return true if at least one player is still in combat
  2. {
  3.  for(Fighter f : _team0.values())
  4.  {
  5.   if(f.isPerco()) return true;
  6.   if(f.isInvocation()
  7.   || f.isDead()
  8.   || f.getPersonnage() == null
  9.   || f.getMob() != null
  10.   || f._double != null
  11.   || f.hasLeft())
  12.   {
  13.    continue;
  14.   }
  15.   if(f.getPersonnage() != null && f.getPersonnage().get_fight() != null
  16.     && f.getPersonnage().get_fight().get_id() == this.get_id()) //If it is not in this fight
  17.   {
  18.    return true;
  19.   }
  20.  }
  21.  for(Fighter f : _team1.values())
  22.  {
  23.   if(f.isPerco()) return true;
  24.   if(f.isInvocation()
  25.     || f.isDead()
  26.     || f.getPersonnage() == null
  27.     || f.getMob() != null
  28.     || f._double != null
  29.     || f.hasLeft())
  30.     {
  31.      continue;
  32.     }
  33.   if(f.getPersonnage() != null && f.getPersonnage().get_fight() != null
  34.     && f.getPersonnage().get_fight().get_id() == this.get_id()) //If it is not in this fight
  35.   {
  36.    return true;
  37.   }
  38.  }
  39.  return false;
  40. }

Reply

Marsh Posté le 12-03-2013 à 22:05:51   

Reply

Marsh Posté le 13-03-2013 à 10:16:13    

si t'es français, hésite pas à parler français sur un forum français ;)

 

Sur ce, je retourne lire ton post.

 

edit: rectification, je ne lirais pas les 500 lignes de code que tu as postées. Tu pourrais pas réduire un peu tout ça ? où est le code utile ?


Message édité par brisssou le 13-03-2013 à 10:18:08

---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 13-03-2013 à 10:38:07    

Je pense que il y a un cas que tu n'as pas prévu et ton joueur "passe au travers" en se retrouvant dans un état non prévu.
Hors de question que j'inspecte tout ce code d'autant plus que je ne connais pas le workflow des états du joueur.
La solution et de mettre des traces sur l'état du joueur dans tous les bouts d'algo qui modifient justement cet état / statut et ca devrait être simple.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed