Forum pour réunir les administrateurs de serveur L2
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  

Partagez | 
 

 (Resolu) Gagner un item pour un PvP

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Ildaril



Nombre de messages : 41
Age : 24
Date d'inscription : 07/11/2007

MessageSujet: (Resolu) Gagner un item pour un PvP   Mer 29 Juil 2009, 19:17

Voila, j'ai deux questions sur lesquelles je me penche depuis déja un bon moment, sans réussite. Je voudrais simplement faire remporter un item, des qu'on tue un adversaire en pvp.
J'ai essayé, de mettre dans le fichier L2PcInstance.java ceci:

Citation :
public void increasePvpGifts()
{
int giftId = 6393;
L2Item temp = ItemTable.getInstance().getTemplate(giftId);

if (!getInventory().validateCapacity(1))
{
sendPacket(new SystemMessage(SystemMessageId.SLOTS_FULL));
return;
}

if (temp != null && !getInventory().validateWeight((int) temp.getWeight()))
{
sendPacket(new SystemMessage(SystemMessageId.WEIGHT_LIMIT_EXCEEDED));
return;
}

L2ItemInstance gift = ItemTable.getInstance().createItem("PvPGift", giftId, 1, this);
getInventory().addItem("PvPGift", gift, this, null);
sendPacket(new InventoryUpdate());
sendMessage("You have obtained 1 " + gift.getItemName() + ".");
}

Ca n'affiche aucune erreur lors de la compil, mais ca n'a aucun effet en jeu.

Mon deuxieme probleme est a mon avis, simple comme bonjour... mais il réussi quand meme a me faire perdre du temps. Je cherche a donner a mon NPC Buffer, la possibilité de buffer les pet, j'ai donc crée le fichier suivant:

L2PetBufferInstance.java

(pas en entier)
Citation :
public class l2petbufferInstance extends L2FolkInstance
{
public l2petbufferInstance(int objectId, L2NpcTemplate template)
{
super(objectId, template);
}


public void onBypassFeedback(L2PcInstance player, String command)
{
player.sendPacket(new ActionFailed());

StringTokenizer st = new StringTokenizer(command, " ");
String actualCommand = st.nextToken(); // Get actual command

if (actualCommand.equalsIgnoreCase("petbuff"))
{
try
{
int skillId = Integer.parseInt(st.nextToken());
int skillLevel = Integer.parseInt(st.nextToken());
int adena = Integer.parseInt(st.nextToken());

this.setTarget(pet);
L2Skill skill;

try
{
try
{
skill = SkillTable.getInstance().getInfo(skillId, skillLevel);

if (adena >= 1)
player.destroyItemByItemId("l2petbufferInstance", 57, adena, null, true);
player.setTarget(pet);
player.enableAllSkills();
player.doCast(skill);

Cette fois ci, je ne peux pas compiler, ca affiche l'erreur suivante:
Citation :
[javac] Compiling 1216 source files to C:\Documents and Settings\Ak3uSeunam.LSDBOT-III\Mes documents\workspace\L2_GameServer_It\build\classes
[javac] C:\Documents and Settings\Ak3uSeunam.LSDBOT-III\Mes documents\workspace\L2_GameServer_It\java\net\sf\l2j\gameserver\model\actor\instance\L2PetBufferInstance.java:34: class l2petbufferInstance is public, should be declared in a file named l2petbufferInstance.java
[javac] public class l2petbufferInstance extends L2FolkInstance
[javac] ^
[javac] C:\Documents and Settings\Ak3uSeunam.LSDBOT-III\Mes documents\workspace\L2_GameServer_It\java\net\sf\l2j\gameserver\model\actor\instance\L2PetBufferInstance.java:57: cannot find symbol
[javac] symbol : variable pet
[javac] location: class net.sf.l2j.gameserver.model.actor.instance.l2petbufferInstance
[javac] this.setTarget(pet);
[javac] ^
[javac] C:\Documents and Settings\Ak3uSeunam.LSDBOT-III\Mes documents\workspace\L2_GameServer_It\java\net\sf\l2j\gameserver\model\actor\instance\L2PetBufferInstance.java:68: cannot find symbol
[javac] symbol : variable pet
[javac] location: class net.sf.l2j.gameserver.model.actor.instance.l2petbufferInstance
[javac] player.setTarget(pet);
[javac] ^
[javac] Note: C:\Documents and Settings\Ak3uSeunam.LSDBOT-III\Mes documents\workspace\L2_GameServer_It\java\net\sf\l2j\gameserver\GeoEngine.java uses or overrides a deprecated API.
[javac] Note: Recompile with -Xlint:deprecation for details.
[javac] 3 errors

Voila, en espérant pouvoir trouvé de l'aide ici, je vous souhaite la bonne soirée.


Dernière édition par Ildaril le Sam 19 Sep 2009, 13:46, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
phpsteuf



Nombre de messages : 570
Date d'inscription : 17/03/2007

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Mer 29 Juil 2009, 19:56

C'est écrit sur le message d'erreur à la compilation, c'est comme le Port-salut !

Simplement :

l2petbufferInstance <> L2PetBufferInstance

Voir : http://fr.wikipedia.org/wiki/Sensibilit%C3%A9_%C3%A0_la_casse
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.loreal.com
Ildaril



Nombre de messages : 41
Age : 24
Date d'inscription : 07/11/2007

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Mer 29 Juil 2009, 23:52

Je ne savais pas qu'en java, les majuscules étaient contés, en tout cas merci, j'essaye ca tout de suite.
Voila l'erreur maintenant:
Citation :

[javac] Compiling 1216 source files to C:\Documents and Settings\Ak3uSeunam.LSDBOT-III\Mes documents\workspace\L2_GameServer_It\build\classes
[javac] C:\Documents and Settings\Ak3uSeunam.LSDBOT-III\Mes documents\workspace\L2_GameServer_It\java\net\sf\l2j\gameserver\model\actor\instance\L2PetBufferInstance.java:57: cannot find symbol
[javac] symbol : variable pet
[javac] location: class net.sf.l2j.gameserver.model.actor.instance.L2PetBufferInstance
[javac] this.setTarget(pet);
[javac] ^
[javac] C:\Documents and Settings\Ak3uSeunam.LSDBOT-III\Mes documents\workspace\L2_GameServer_It\java\net\sf\l2j\gameserver\model\actor\instance\L2PetBufferInstance.java:68: cannot find symbol
[javac] symbol : variable pet
[javac] location: class net.sf.l2j.gameserver.model.actor.instance.L2PetBufferInstance
[javac] player.setTarget(pet);
[javac] ^
[javac] Note: C:\Documents and Settings\Ak3uSeunam.LSDBOT-III\Mes documents\workspace\L2_GameServer_It\java\net\sf\l2j\gameserver\GeoEngine.java uses or overrides a deprecated API.
[javac] Note: Recompile with -Xlint:deprecation for details.
[javac] 2 errors
J'essaye d'y remédier...


Je voudrais préciser que le gain d'item lors du pvp est une priorité majeur pour mon serveur, et ne pourra pas être lancé sans ce mode.

Cordialement.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ghurdyl



Nombre de messages : 26
Age : 29
Localisation : Belgique
Date d'inscription : 17/06/2009

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Sam 01 Aoû 2009, 12:20

pour tes item rewards, où et comment est-ce que tu appelles ta méthode "public void increasePvpGifts()"

La déclarer c'est bien mais l'appeler (au bon moment) c'est mieux.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Sicca



Nombre de messages : 22
Date d'inscription : 25/04/2009

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Lun 03 Aoû 2009, 01:30

edit
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ildaril



Nombre de messages : 41
Age : 24
Date d'inscription : 07/11/2007

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Dim 09 Aoû 2009, 14:12

Je n'ai pas bien saisi ta réponse Ghurdyl, je te montre le script qui comprend le fait de recevoir un point pvp lorsqu'on tue un adversaire, et le script que j'ai ajouté pour gagner un item:

Code:
   public void onKillUpdatePvPKarma(L2Character target)
   {
      if (target == null) return;
      if (!(target instanceof L2PlayableInstance)) return;

      L2PcInstance targetPlayer = null;
      if (target instanceof L2PcInstance)
         targetPlayer = (L2PcInstance)target;
      else if (target instanceof L2Summon)
         targetPlayer = ((L2Summon)target).getOwner();

      if (targetPlayer == null) return;                                          // Target player is null
      if (targetPlayer == this) return;                                          // Target player is self

      if (isCursedWeaponEquiped())
      {
         CursedWeaponsManager.getInstance().increaseKills(_cursedWeaponEquipedId);
         return;
      }

      // If in duel and you kill (only can kill l2summon), do nothing
      if (isInDuel() && targetPlayer.isInDuel()) return;

        // If in Arena, do nothing
      if (isInsideZone(ZONE_PVP) || targetPlayer.isInsideZone(ZONE_PVP))
         return;

        // Check if it's pvp
      if (
            (
                  checkIfPvP(target) &&            //  Can pvp and
                  targetPlayer.getPvpFlag() != 0  //  Target player has pvp flag set
            ) ||                                    // or
            (
                  isInsideZone(ZONE_PVP) &&               //  Player is inside pvp zone and
                  targetPlayer.isInsideZone(ZONE_PVP)     //  Target player is inside pvp zone
            )
      )
      {
            increasePvpKills();
      }
      else                                                                        // Target player doesn't have pvp flag set
      {
            // check about wars
            if (targetPlayer.getClan() != null && getClan() != null)
            {
                if (getClan().isAtWarWith(targetPlayer.getClanId()))
                {
                    if (targetPlayer.getClan().isAtWarWith(getClanId()))
                    {
                        // 'Both way war' -> 'PvP Kill'
                        increasePvpKills();
                        return;
                    }
                }
            }

            // 'No war' or 'One way war' -> 'Normal PK'
         if (targetPlayer.getKarma() > 0)                                        // Target player has karma
         {
            if ( Config.KARMA_AWARD_PK_KILL )
            {
                    increasePvpKills();
            }
         }
         else if (targetPlayer.getPvpFlag() == 0)                                                                    // Target player doesn't have karma
         {
                increasePkKillsAndKarma(targetPlayer.getLevel());
         }
      }
   }

    /**
    * Increase the pvp kills count and send the info to the player
    *
    */
    public void increasePvpKills()
    {
        // Add karma to attacker and increase its PK counter
        setPvpKills(getPvpKills() + 1);

        // Send a Server->Client UserInfo packet to attacker with its Karma and PK Counter
        sendPacket(new UserInfo(this));
    }

public void increasePvpGifts()
{
  int giftId  = -6393;
  L2Item temp  = ItemTable.getInstance().getTemplate(giftId);

  if (!getInventory().validateCapacity(1))
  {
      sendPacket(new SystemMessage(SystemMessageId.SLOTS_FULL));
      return;
  }

  if (temp != null && !getInventory().validateWeight((int) temp.getWeight()))
  {
      sendPacket(new SystemMessage(SystemMessageId.WEIGHT_LIMIT_EXCEEDED));
      return;
  }

  L2ItemInstance gift = ItemTable.getInstance().createItem("PvPGift", giftId, 1, this);
  getInventory().addItem("PvPGift", gift, this, null);
  sendPacket(new InventoryUpdate());
  sendMessage("You have obtained 1 " + gift.getItemName() + ".");
 
        {
            increasePvpGifts();
      }
}
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ghurdyl



Nombre de messages : 26
Age : 29
Localisation : Belgique
Date d'inscription : 17/06/2009

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Dim 09 Aoû 2009, 20:23

Iladril a écrit:
Je n'ai pas bien saisi ta réponse Ghurdyl, je te montre le script qui comprend le fait de recevoir un point pvp lorsqu'on tue un adversaire, et le script que j'ai ajouté pour gagner un item:
Il faut que l'un appelle explicitement l'autre.

si je regarde bien le code que tu postes, tu ajoutes une méthode "updatePvPGift" à la classe L2PCInstance.

Cette méthode devrait ajouter un item à l'inventaire de l'instance courante du joueur.

Mais cette méthode n'est pas appelée automatiquement, je dirais même que de par les codes que tu donnes, elle n'est jamais appelée / exécutée.

De plus, l'appel de ta méthode "increasePvpGifts();"
dans le code même de la méthode va crasher ton serveur car c'est une récursive sans condition de sortie (effet similaire à une boucle infinie)

Pour moi cette instruction d'appel à ta méthode devrait plutôt se trouver dans la méthode "public void increasePvpKills()"

comme ceci par exemple :
L2PcInstance.java : modification te ta méthode :
Code:
public void increasePvpGifts()
{
  int giftId  = -6393;
  L2Item temp  = ItemTable.getInstance().getTemplate(giftId);

  if (!getInventory().validateCapacity(1))
  {
      sendPacket(new SystemMessage(SystemMessageId.SLOTS_FULL));
      return;
  }

  if (temp != null && !getInventory().validateWeight((int) temp.getWeight()))
  {
      sendPacket(new SystemMessage(SystemMessageId.WEIGHT_LIMIT_EXCEEDED));
      return;
  }

  L2ItemInstance gift = ItemTable.getInstance().createItem("PvPGift", giftId, 1, this);
  getInventory().addItem("PvPGift", gift, this, null);
  sendPacket(new InventoryUpdate());
  sendMessage("You have obtained 1 " + gift.getItemName() + ".");
  // <- suppression de 3 lignes
}
Tu remarqueras la suppression des 3 dernières ligne spar rapport à ton code.

L2PcInstance.java : modification de la méthode increasePvpKills()
Code:
    public void increasePvpKills()
    {
        // Add karma to attacker and increase its PK counter
        setPvpKills(getPvpKills() + 1);

        // Send a Server->Client UserInfo packet to attacker with its Karma and PK Counter
        sendPacket(new UserInfo(this));
        sendPacket(new ExBrExtraUserInfo(this));
 
        increasePvpGifts(); // <- appel à ta propre méthode
     
    }
Ti noteras l'ajout de l'appel de ta méthode à la fin

de cette façon, la méthode que tu viens d'écrire sera exécutée une seule fois (au lieu d'une infinité) en même temps que la méthode habituelle increasePvpKills().
N.B. avec ce code, un PK reçoit aussi l'item.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Kin0u



Nombre de messages : 19
Date d'inscription : 03/12/2008

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Mar 11 Aoû 2009, 18:00

je comprend pas pourqquoi tu dis que meme les pk seront récompensé vu que il y a 2 méthode différente , il y a quelque chose qui m'échappe
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ildaril



Nombre de messages : 41
Age : 24
Date d'inscription : 07/11/2007

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Mar 11 Aoû 2009, 18:06

Merci à toi Ghurdyl, j'ai essayé ce que tu m'as donné, je n'ai pas pu le compiler avec
Code:
sendPacket(new ExBrExtraUserInfo(this));
il ne connaissait apparemment pas ce language. J'en profite pour dire que je travail sur un serveur L2j Interlude.

J'ai donc enlever le code qui n'était pas connu, et ça a fonctionné, mais rien ne se passe en jeux, que ce soit lors d'un PVP, ou d'un PK.

edit: en fait si il se passe quelque chose dans la console gameserver:
Code:

11 août 2009 17:01:37 net.sf.l2j.gameserver.model.L2Character callSkill
ATTENTION:
java.lang.ArrayIndexOutOfBoundsException: -6393
   at net.sf.l2j.gameserver.datatables.ItemTable.getTemplate(ItemTable.java:652)
   at net.sf.l2j.gameserver.model.actor.instance.L2PcInstance.increasePvpGifts(L2PcInstance.java:4461)
   at net.sf.l2j.gameserver.model.actor.instance.L2PcInstance.increasePvpKills(L2PcInstance.java:4454)
   at net.sf.l2j.gameserver.model.actor.instance.L2PcInstance.onKillUpdatePvPKarma(L2PcInstance.java:4409)
   at net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance.doDie(L2PlayableInstance.java:99)
   at net.sf.l2j.gameserver.model.actor.instance.L2PcInstance.doDie(L2PcInstance.java:4163)
   at net.sf.l2j.gameserver.model.actor.status.CharStatus.reduceHp(CharStatus.java:209)
   at net.sf.l2j.gameserver.model.actor.status.PlayableStatus.reduceHp(PlayableStatus.java:44)
   at net.sf.l2j.gameserver.model.actor.status.PcStatus.reduceHp(PcStatus.java:110)
   at net.sf.l2j.gameserver.model.actor.status.PcStatus.reduceHp(PcStatus.java:48)
   at net.sf.l2j.gameserver.model.actor.instance.L2PcInstance.reduceCurrentHp(L2PcInstance.java:9126)
   at net.sf.l2j.gameserver.handler.skillhandlers.Pdam.useSkill(Pdam.java:240)
   at net.sf.l2j.gameserver.model.L2Character.callSkill(L2Character.java:5804)
   at net.sf.l2j.gameserver.model.L2Character.onMagicHitTimer(L2Character.java:5515)
   at net.sf.l2j.gameserver.model.L2Character$MagicUseTask.run(L2Character.java:1831)
   at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
   at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
   at java.util.concurrent.FutureTask.run(Unknown Source)
   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source)
   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
   at java.lang.Thread.run(Unknown Source)


Dernière édition par Ildaril le Dim 23 Aoû 2009, 18:09, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Skatershi



Nombre de messages : 1305
Age : 28
Date d'inscription : 09/11/2006

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Mar 11 Aoû 2009, 18:31

L'id de l'objet ne peut être négatif; C'est 6393 que tu dois mettre.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ghurdyl



Nombre de messages : 26
Age : 29
Localisation : Belgique
Date d'inscription : 17/06/2009

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Sam 15 Aoû 2009, 11:16

Pour ce qui est du code non reconnu, bêtement le supprimer n'est peut-être pas la meilleure option.

En fait la méthode "increasePvpKills()" existe déjà dans la classe l2PcInstance (fichier L2PcInstance.java) que tu modifies.

Il faut garder 100% du code de cette méthode et y ajouter l'appel vers ta méthode à toi "increasePvpGifts()"
Code:
public void increasePvpKills()
{
    ... le code existant de la méthode ...
    increasePvpGifts();
}

Pour les PK's, il existe en effet 2 méthodes et suivant l'effet souhaité l'appel à la méthode "increasePvpGifts()" doit se trouver au bon endroit.
Dans le code que je propose (version Gracia Final) pour "increasePvpKills()" l'appel de la méthode se fait en dehors du code qui déternime si le kill est un PK ou non. Il n'en tient donc pas compte.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Ildaril



Nombre de messages : 41
Age : 24
Date d'inscription : 07/11/2007

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Dim 23 Aoû 2009, 18:44

Merci a vous, ca marche enfin!

Reste un petit problème, l'inventaire ne se met pas a jour, pourtant il y a bien écrit " sendPacket(new InventoryUpdate()); ".
J'ai meme essayé de le rajouter apres " increasePvpGifts(); " mais rien n'y fait, on ne voit l'item gagné qu'après avoir redémarré.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Sicca



Nombre de messages : 22
Date d'inscription : 25/04/2009

MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Lun 24 Aoû 2009, 02:53

Ildaril a écrit:
Merci a vous, ca marche enfin!

Reste un petit problème, l'inventaire ne se met pas a jour, pourtant il y a bien écrit " sendPacket(new InventoryUpdate()); ".
J'ai meme essayé de le rajouter apres " increasePvpGifts(); " mais rien n'y fait, on ne voit l'item gagné qu'après avoir redémarré.

il faut enregistrer les informations coté serveur .
Il y a une methode qui fait ça (update de la base) , je ne me souviens plus trop de son nom exact mais c'est facile a trouver.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: (Resolu) Gagner un item pour un PvP   Aujourd'hui à 17:41

Revenir en haut Aller en bas
 
(Resolu) Gagner un item pour un PvP
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Gagner du temps pour éjecter vos périphériques
» [RESOLU] Aires de service pour camping car
» [résolu] script ou code pour mettre une application sur mon forum ??
» [Résolu] Retirer le captcha pour les invités de passage
» [résolu] code trop grand pour le mettre dans "description du site*"

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
L2J-FR :: Général :: Aides et Conseils-
Sauter vers: