Скрипт на выдачу награды за статистику PvP/ PvP Reward Script

Deazer

Head Developer
Staff member
Code:
package services;

import l2.gameserver.listener.actor.OnKillListener;
import l2.gameserver.listener.actor.player.OnPlayerEnterListener;
import l2.gameserver.model.Creature;
import l2.gameserver.model.Player;
import l2.gameserver.model.Skill;
import l2.gameserver.model.actor.listener.PlayerListenerList;
import l2.gameserver.network.l2.s2c.SkillList;
import l2.gameserver.scripts.Functions;
import l2.gameserver.scripts.ScriptFile;
import l2.gameserver.tables.SkillTable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PVPBonus extends Functions implements ScriptFile, OnKillListener, OnPlayerEnterListener
{

  private static final String     MESSAGE_ON_REWARD = "PVP бонус: %RANK%";
  private static final List<Rank> ranks             = new ArrayList<Rank>();

  @Override
  public void onLoad()
  {
    // ранги добавлять по воз врастающей мин. кол-ва пвп
    // шаблон: Имя ранга, мин.пвп, скилл, уровень скилла
    ranks.add(new Rank("1%", 100, 5650, 1));
    ranks.add(new Rank("2%", 200, 5650, 2));
    ranks.add(new Rank("3%", 300, 5650, 3));
    ranks.add(new Rank("4%", 400, 5650, 4));
    ranks.add(new Rank("5%", 500, 5650, 5));

    Collections.reverse(ranks);
    PlayerListenerList.addGlobal(this);
  }

  @Override
  public void onKill(Creature actor, Creature victim)
  {
    if(actor.isPlayer() && victim.isPlayer())
    {
      Player player = actor.getPlayer();
      Rank rank = getRank(player.getPvpKills());
      if(rank == null)
      {
        return;
      }
      if(player.getSkillLevel(rank.skill.getId()) == rank.skill.getLevel())
      {
        return;
      }

      player.addSkill(rank.skill, false);
      player.sendPacket(new SkillList(player));
      player.broadcastUserInfo(false);
      player.sendMessage(MESSAGE_ON_REWARD.replaceFirst("%RANK%", rank.name));
    }
  }

  @Override
  public boolean ignorePetOrSummon()
  {
    return false;
  }

  /**
   * Возвращает ранг, исходя из кол-ва pvp.
   *
   * @param pvp - кол-во пвп
   * @return Rank - ранг
   */
  public Rank getRank(int pvp)
  {
    for(Rank rank : ranks)
    {
      if(pvp >= rank.minPvp)
      {
        return rank;
      }
    }
    return null;
  }

  @Override
  public void onReload()
  {
    PlayerListenerList.removeGlobal(this);
  }

  @Override
  public void onShutdown()
  {
    PlayerListenerList.removeGlobal(this);
  }

  @Override
  public void onPlayerEnter(Player player)
  {
    Rank rank = getRank(player.getPvpKills());
    if(rank == null)
    {
      return;
    }
    if(player.getSkillLevel(rank.skill.getId()) == rank.skill.getLevel())
    {
      return;
    }
    player.addSkill(rank.skill, false);
    player.sendPacket(new SkillList(player));
    player.broadcastUserInfo(false);
  }

  public static class Rank
  {
    String name;
    int    minPvp;
    Skill  skill;

    public Rank(String name, int minPvp, int skillID, int skillLvl)
    {
      this.name = name;
      this.minPvp = minPvp;
      this.skill = SkillTable.getInstance().getInfo(skillID, skillLvl);
    }
  }
}

Код не мой, попросили адаптировать. Как будет время сделаю нормальный код. Это можно использовать, но чистый хардкод и бред.
 
@Deazer is a good idea to save the skills via mysql or its better to store them in the java? Which method is better?
Not need to save ani thinks,
Because here is on login code gives skills
Code:
  @Override
  public void onPlayerEnter(Player player)
  {
    Rank rank = getRank(player.getPvpKills());
    if(rank == null)
    {
      return;
    }
    if(player.getSkillLevel(rank.skill.getId()) == rank.skill.getLevel())
    {
      return;
    }
    player.addSkill(rank.skill, false);
    player.sendPacket(new SkillList(player));
    player.broadcastUserInfo(false);
  }

What kinkd of problems you have?
 
Not need to save ani thinks,
Because here is on login code gives skills
Code:
  @Override
  public void onPlayerEnter(Player player)
  {
    Rank rank = getRank(player.getPvpKills());
    if(rank == null)
    {
      return;
    }
    if(player.getSkillLevel(rank.skill.getId()) == rank.skill.getLevel())
    {
      return;
    }
    player.addSkill(rank.skill, false);
    player.sendPacket(new SkillList(player));
    player.broadcastUserInfo(false);
  }

What kinkd of problems you have?
The code that you share have these problems:
1. when a player receive the 1st skill on 100pvp and the server have been restarted the player can not login (he stuck on black screen).
2. The pvps will not be saved after the player do restart.
3. The when reach any level you earn the skill but you need to do restart to see the skill in your skill list.
There were other problems that I dont exactly remember because it was before few weeks ago.
I have manage to fix all bugs. I added more features like when a player reach 100 pvps for example and if its mage or fighter it will give a different skill. For example Mageskill1 = 10000 FighterSkill1 = 100001 and so on.
And thats why I asked you which way is better to store the skills because currently I store them in mysql db.
 
I understand you... alright, I will write a script for us and integrate it into the product. If you really need it and you encounter any issues...
As I mention I fixed all bugs for the moment, I added config for the mage/fighter skills but maybe your version will be way better than mine. I will be more than happy to see it. The script is good for PvP servers mostly but it can be implemented in low rate servers.
 
As I mention I fixed all bugs for the moment, I added config for the mage/fighter skills but maybe your version will be way better than mine. I will be more than happy to see it. The script is good for PvP servers mostly but it can be implemented in low rate servers.
So, I'm finish with code. Now I'm waiting for your suggestions so I don't have to rewrite multiple times.

И так, закончил. Теперь жду ваших предложений что бы не пришлось переписывать несколько раз.
Если что то нужно - пишите будьте любезны сразу.

This is what it looks like now:

Code:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE list SYSTEM "pvp_bonus_ranks.dtd">
<list>
    <rank rankId="1" minLevel="1" maxLevel="80" minPvp="100" skillId="4225" skillLevel="1" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="2" minLevel="1" maxLevel="80" minPvp="200" skillId="4225" skillLevel="2" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="3" minLevel="1" maxLevel="80" minPvp="300" skillId="4225" skillLevel="3" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="4" minLevel="1" maxLevel="80" minPvp="400" skillId="4225" skillLevel="4" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="5" minLevel="1" maxLevel="80" minPvp="500" skillId="4225" skillLevel="5" rewardItemId="0" rewardItemCount="0"/>
</list>
Need something more or not ?
 
Last edited:
So, I'm finish with code. Now I'm waiting for your suggestions so I don't have to rewrite multiple times.

И так, закончил. Теперь жду ваших предложений что бы не пришлось переписывать несколько раз.
Если что то нужно - пишите будьте любезны сразу.

This is what it looks like now:

Code:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE list SYSTEM "pvp_bonus_ranks.dtd">
<list>
    <rank rankId="1" minLevel="1" maxLevel="80" minPvp="100" skillId="4225" skillLevel="1" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="2" minLevel="1" maxLevel="80" minPvp="200" skillId="4225" skillLevel="2" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="3" minLevel="1" maxLevel="80" minPvp="300" skillId="4225" skillLevel="3" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="4" minLevel="1" maxLevel="80" minPvp="400" skillId="4225" skillLevel="4" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="5" minLevel="1" maxLevel="80" minPvp="500" skillId="4225" skillLevel="5" rewardItemId="0" rewardItemCount="0"/>
</list>
Need something more or not ?
2 Features:
1. Just make sure to add option when a player reach for example rank 3 to have the skills from 1 to 3 in total 3 skills. Not to give the skill on the current rankID for example I'm level 3 rank and I have 1 skill only.
2. Add an option to give different skill to mage/fighters/tanks. It can be a config or just anything. Example based on player class ID:
MageClassID = 88, 90, 103
MageSkillsID = rankid=1 skill 4225, rankid=2 skill 4227 and so on

FighterClassID = 101, 105, 108
FighterSkillsID = rankid=1 skill 4228, rankid=2 skill 4229 and so on

TankClassID= 101, 105, 108
TankSkillId = rankid=1 skill 4238, rankid=2 skill 4239 and so on


The separation is because the mage can get a skill that can increase their m.atk or cast. speed and same for the fighters. For the tanks can be skills with health/resists/defance

This is just the idea, I know you can execute it in better way.
 
About classes you can separate directly in skill by classes - separating by classes is redundant logic for the script.
About skills for rank - I can make many skills for each rank
 
So, I'm finish with code. Now I'm waiting for your suggestions so I don't have to rewrite multiple times.

И так, закончил. Теперь жду ваших предложений что бы не пришлось переписывать несколько раз.
Если что то нужно - пишите будьте любезны сразу.

This is what it looks like now:

Code:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE list SYSTEM "pvp_bonus_ranks.dtd">
<list>
    <rank rankId="1" minLevel="1" maxLevel="80" minPvp="100" skillId="4225" skillLevel="1" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="2" minLevel="1" maxLevel="80" minPvp="200" skillId="4225" skillLevel="2" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="3" minLevel="1" maxLevel="80" minPvp="300" skillId="4225" skillLevel="3" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="4" minLevel="1" maxLevel="80" minPvp="400" skillId="4225" skillLevel="4" rewardItemId="0" rewardItemCount="0"/>
    <rank rankId="5" minLevel="1" maxLevel="80" minPvp="500" skillId="4225" skillLevel="5" rewardItemId="0" rewardItemCount="0"/>
</list>
Need something more or not ?
обязательно добавить параметр проверки на hwid - дабы исключить буст по наградам , уже проходил этот момент с этим скриптом
 
обязательно добавить параметр проверки на hwid - дабы исключить буст по наградам , уже проходил этот момент с этим скриптом
Так и знал !! Так и знал что это будет тут - это вообще не относиться к данному скрипту - выдача пвп это абсолютно другая логика и находиться в PvP prop. Логика данного скрипта - ТОЛЬКО дать награду за кол-во пвп. Не больше, не меньше и ни каким образом не затрагивает логику начислен пвп поинтов.
 
обязательно добавить параметр проверки на hwid - дабы исключить буст по наградам , уже проходил этот момент с этим скриптом
Ну так накрутку пвп убери, там же конфиг есть вроде, не начислять пвп проверка по ип/хвид
 
Так и знал !! Так и знал что это будет тут - это вообще не относиться к данному скрипту - выдача пвп это абсолютно другая логика и находиться в PvP prop. Логика данного скрипта - ТОЛЬКО дать награду за кол-во пвп. Не больше, не меньше и ни каким образом не затрагивает логику начислен пвп поинтов.
речь не про пвп пойнты, а речь про rewardItemId="0" rewardItemCount="0" ( буст предметов ).
Человек единожды получил награду апнув ранг на чаре, далее идет на нового чара и так же апает ранг и получает опять эту же награду, они с друзьями садятся и начинают так бустить
 
Ну так накрутку пвп убери, там же конфиг есть вроде, не начислять пвп проверка по ип/хвид
речь о том, что бы не давало награду повторно на новом чаре , если ты уже получил ее на другом чаре.
У меня эта фишка уже год стоит и я на ней такую собаку схавал в 1 открытие, когда игроки из 1 клана сидели и ночами бустили чара за чаром на pvp и pk рангах и донки фармили без кд)
по этому нужна проверка на выдачу повторной награды по hwid
1730189134354.webp
 
речь не про пвп пойнты, а речь про rewardItemId="0" rewardItemCount="0" ( буст предметов ).
Человек единожды получил награду апнув ранг на чаре, далее идет на нового чара и так же апает ранг и получает опять эту же награду, они с друзьями садятся и начинают так бустить
а что ему будет мешать вылогинить чара на момент получения.
Это не имеет смысла от слова совсем. Ты перегрузил скрипт излишней логикой.
 
Finally
Code:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE list SYSTEM "pvp_bonus_ranks.dtd">
<list>
    <rank rankId="1" minLevel="1" maxLevel="80" minPvp="100" rewardItemId="0" rewardItemCount="0" announceCustomMsg="service.pvpbonus.rankup">
        <skills>
            <skill skillId="4225" skillLevel="1"/>
            <skill skillId="4275" skillLevel="1"/>
        </skills>
    </rank>
    <rank rankId="2" minLevel="1" maxLevel="80" minPvp="200" rewardItemId="0" rewardItemCount="0" announceCustomMsg="service.pvpbonus.rankup">
        <skills>
            <skill skillId="4225" skillLevel="2"/>
            <skill skillId="4275" skillLevel="2"/>
        </skills>
    </rank>
    <rank rankId="3" minLevel="1" maxLevel="80" minPvp="300" rewardItemId="0" rewardItemCount="0" announceCustomMsg="service.pvpbonus.rankup">
        <skills>
            <skill skillId="4225" skillLevel="3"/>
            <skill skillId="4275" skillLevel="3"/>
        </skills>
    </rank>
    <rank rankId="4" minLevel="1" maxLevel="80" minPvp="400" rewardItemId="0" rewardItemCount="0" announceCustomMsg="service.pvpbonus.rankup">
        <skills>
            <skill skillId="4225" skillLevel="4"/>
            <skill skillId="4275" skillLevel="4"/>
        </skills>
    </rank>
    <rank rankId="5" minLevel="1" maxLevel="80" minPvp="500" rewardItemId="0" rewardItemCount="0" announceCustomMsg="service.pvpbonus.rankup">
        <skills>
            <skill skillId="4225" skillLevel="5"/>
            <skill skillId="4275" skillLevel="5"/>
        </skills>
    </rank>
</list>

Also rewardItemId="0" rewardItemCount="0" announceMsg="service.pvpbonus.rankup" is implied, you can remove if not needed to announce or items reward
 
Code:
package services;

import l2.gameserver.listener.actor.OnKillListener;
import l2.gameserver.listener.actor.player.OnPlayerEnterListener;
import l2.gameserver.model.Creature;
import l2.gameserver.model.Player;
import l2.gameserver.model.Skill;
import l2.gameserver.model.actor.listener.PlayerListenerList;
import l2.gameserver.network.l2.s2c.SkillList;
import l2.gameserver.scripts.Functions;
import l2.gameserver.scripts.ScriptFile;
import l2.gameserver.tables.SkillTable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PVPBonus extends Functions implements ScriptFile, OnKillListener, OnPlayerEnterListener
{

  private static final String     MESSAGE_ON_REWARD = "PVP бонус: %RANK%";
  private static final List<Rank> ranks             = new ArrayList<Rank>();

  @Override
  public void onLoad()
  {
    // ранги добавлять по воз врастающей мин. кол-ва пвп
    // шаблон: Имя ранга, мин.пвп, скилл, уровень скилла
    ranks.add(new Rank("1%", 100, 5650, 1));
    ranks.add(new Rank("2%", 200, 5650, 2));
    ranks.add(new Rank("3%", 300, 5650, 3));
    ranks.add(new Rank("4%", 400, 5650, 4));
    ranks.add(new Rank("5%", 500, 5650, 5));

    Collections.reverse(ranks);
    PlayerListenerList.addGlobal(this);
  }

  @Override
  public void onKill(Creature actor, Creature victim)
  {
    if(actor.isPlayer() && victim.isPlayer())
    {
      Player player = actor.getPlayer();
      Rank rank = getRank(player.getPvpKills());
      if(rank == null)
      {
        return;
      }
      if(player.getSkillLevel(rank.skill.getId()) == rank.skill.getLevel())
      {
        return;
      }

      player.addSkill(rank.skill, false);
      player.sendPacket(new SkillList(player));
      player.broadcastUserInfo(false);
      player.sendMessage(MESSAGE_ON_REWARD.replaceFirst("%RANK%", rank.name));
    }
  }

  @Override
  public boolean ignorePetOrSummon()
  {
    return false;
  }

  /**
   * Возвращает ранг, исходя из кол-ва pvp.
   *
   * @param pvp - кол-во пвп
   * @return Rank - ранг
   */
  public Rank getRank(int pvp)
  {
    for(Rank rank : ranks)
    {
      if(pvp >= rank.minPvp)
      {
        return rank;
      }
    }
    return null;
  }

  @Override
  public void onReload()
  {
    PlayerListenerList.removeGlobal(this);
  }

  @Override
  public void onShutdown()
  {
    PlayerListenerList.removeGlobal(this);
  }

  @Override
  public void onPlayerEnter(Player player)
  {
    Rank rank = getRank(player.getPvpKills());
    if(rank == null)
    {
      return;
    }
    if(player.getSkillLevel(rank.skill.getId()) == rank.skill.getLevel())
    {
      return;
    }
    player.addSkill(rank.skill, false);
    player.sendPacket(new SkillList(player));
    player.broadcastUserInfo(false);
  }

  public static class Rank
  {
    String name;
    int    minPvp;
    Skill  skill;

    public Rank(String name, int minPvp, int skillID, int skillLvl)
    {
      this.name = name;
      this.minPvp = minPvp;
      this.skill = SkillTable.getInstance().getInfo(skillID, skillLvl);
    }
  }
}

Код не мой, попросили адаптировать. Как будет время сделаю нормальный код. Это можно использовать, но чистый хардкод и бред.
Is there any video teaching how to apply these codes in the revision? Because whenever I try, nothing works, and errors always show up in IntelliJ IDEA.
 
Back
Top