| (Resolu) Gagner un item pour un PvP | |
|
|
Auteur | Message |
---|
Ildaril
Nombre de messages : 41 Age : 32 Date d'inscription : 07/11/2007
| Sujet: (Resolu) Gagner un item pour un PvP 29/07/09, 06:17 pm | |
| 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 19/09/09, 12:46 pm, édité 1 fois | |
|
| |
phpsteuf
Nombre de messages : 570 Date d'inscription : 17/03/2007
| Sujet: Re: (Resolu) Gagner un item pour un PvP 29/07/09, 06:56 pm | |
| | |
|
| |
Ildaril
Nombre de messages : 41 Age : 32 Date d'inscription : 07/11/2007
| Sujet: Re: (Resolu) Gagner un item pour un PvP 29/07/09, 10:52 pm | |
| 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. | |
|
| |
Ghurdyl
Nombre de messages : 26 Age : 37 Localisation : Belgique Date d'inscription : 17/06/2009
| Sujet: Re: (Resolu) Gagner un item pour un PvP 01/08/09, 11:20 am | |
| 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. | |
|
| |
Sicca
Nombre de messages : 22 Date d'inscription : 25/04/2009
| Sujet: Re: (Resolu) Gagner un item pour un PvP 03/08/09, 12:30 am | |
| | |
|
| |
Ildaril
Nombre de messages : 41 Age : 32 Date d'inscription : 07/11/2007
| Sujet: Re: (Resolu) Gagner un item pour un PvP 09/08/09, 01:12 pm | |
| 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(); } } | |
|
| |
Ghurdyl
Nombre de messages : 26 Age : 37 Localisation : Belgique Date d'inscription : 17/06/2009
| Sujet: Re: (Resolu) Gagner un item pour un PvP 09/08/09, 07:23 pm | |
| - 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. | |
|
| |
Kin0u
Nombre de messages : 19 Date d'inscription : 03/12/2008
| Sujet: Re: (Resolu) Gagner un item pour un PvP 11/08/09, 05:00 pm | |
| 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 | |
|
| |
Ildaril
Nombre de messages : 41 Age : 32 Date d'inscription : 07/11/2007
| Sujet: Re: (Resolu) Gagner un item pour un PvP 11/08/09, 05:06 pm | |
| 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 23/08/09, 05:09 pm, édité 1 fois | |
|
| |
Skatershi
Nombre de messages : 1305 Age : 36 Date d'inscription : 09/11/2006
| Sujet: Re: (Resolu) Gagner un item pour un PvP 11/08/09, 05:31 pm | |
| L'id de l'objet ne peut être négatif; C'est 6393 que tu dois mettre. | |
|
| |
Ghurdyl
Nombre de messages : 26 Age : 37 Localisation : Belgique Date d'inscription : 17/06/2009
| Sujet: Re: (Resolu) Gagner un item pour un PvP 15/08/09, 10:16 am | |
| 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. | |
|
| |
Ildaril
Nombre de messages : 41 Age : 32 Date d'inscription : 07/11/2007
| Sujet: Re: (Resolu) Gagner un item pour un PvP 23/08/09, 05:44 pm | |
| 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é. | |
|
| |
Sicca
Nombre de messages : 22 Date d'inscription : 25/04/2009
| Sujet: Re: (Resolu) Gagner un item pour un PvP 24/08/09, 01:53 am | |
| - 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. | |
|
| |
Contenu sponsorisé
| Sujet: Re: (Resolu) Gagner un item pour un PvP | |
| |
|
| |
| (Resolu) Gagner un item pour un PvP | |
|