Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Museum Manager | Class Balancer | Skills Balancer

Iniciado por Swarlog, Ago 19, 2022, 03:21 AM

Tema anterior - Siguiente tema

Swarlog

CitarCORE
### Eclipse Workspace Patch 1.0
#P L2J_ReunionProject_Core
Index: java/l2r/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/l2r/gameserver/model/actor/instance/L2PcInstance.java (revision 3)
+++ java/l2r/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -327,6 +327,8 @@
 import l2r.gameserver.util.Util;
 import l2r.util.EnumIntBitmask;
 import l2r.util.Rnd;
+import museum.MuseumManager;
+import museum.MuseumPlayer;
 import gr.reunion.achievementEngine.AchievementsHandler;
 import gr.reunion.configsEngine.AntibotConfigs;
 import gr.reunion.configsEngine.CustomServerConfigs;
@@ -468,6 +470,7 @@
  private volatile boolean _isOnline = false;
  private long _onlineTime;
  private long _onlineBeginTime;
+ private long _museumOnlineTime;
  private long _lastAccess;
  private long _uptime;
  private long _zoneRestartLimitTime = 0;
@@ -3018,6 +3021,11 @@
  _onlineBeginTime = System.currentTimeMillis();
  }
 
+ public void refreshMuseumOnlineTime()
+ {
+ _museumOnlineTime = System.currentTimeMillis();
+ }
+
  public long getZoneRestartLimitTime()
  {
  return _zoneRestartLimitTime;
@@ -3701,6 +3709,10 @@
  ward.activate(this, createdItem);
  }
  }
+ if (itemId == 57)
+ {
+ getMuseumPlayer().addData("adena", count);
+ }
  return createdItem;
  }
  }
@@ -5782,6 +5794,11 @@
 
  AntiFeedManager.getInstance().setLastDeathTime(getObjectId());
 
+ if (killer instanceof L2Attackable)
+ {
+ getMuseumPlayer().addData("monster_deaths", 1);
+ }
+
  if (isPhoenixBlessed() || (isAffected(EffectFlag.CHARM_OF_COURAGE) && isInSiege()))
  {
  reviveRequest(this, null, false);
@@ -6016,6 +6033,9 @@
 
  setPvpKills(getPvpKills() + 1);
 
+ getMuseumPlayer().addData("pvp_victories", 1);
+ ((L2PcInstance) target).getMuseumPlayer().addData("pvp_defeats", 1);
+
  // Send a Server->Client UserInfo packet to attacker with its Karma and PK Counter
  sendPacket(new UserInfo(this));
  sendPacket(new ExBrExtraUserInfo(this));
@@ -6047,6 +6067,8 @@
  if (target.isPlayer())
  {
  setPkKills(getPkKills() + 1);
+ getMuseumPlayer().addData("pk_victories", 1);
+ ((L2PcInstance) target).getMuseumPlayer().addData("pk_defeats", 1);
  }
 
  // Color system
@@ -7614,7 +7636,7 @@
 
  // Language
  player.setLang(rset.getString("language"));
-
+ player.refreshMuseumOnlineTime();
  // Retrieve the name and ID of the other characters assigned to this account.
  try (PreparedStatement stmt = con.prepareStatement("SELECT charId, char_name FROM characters WHERE account_name=? AND charId<>?"))
  {
@@ -7691,6 +7713,8 @@
 
  player.restoreFriendList();
 
+ MuseumManager.getInstance().restoreDataForChar(player);
+
  if (Config.STORE_UI_SETTINGS)
  {
  player.restoreUISettings();
@@ -7985,6 +8009,8 @@
  }
  SevenSigns.getInstance().saveSevenSignsData(getObjectId());
 
+ MuseumManager.getInstance().updateDataForChar(this);
+
  final PlayerVariables vars = getScript(PlayerVariables.class);
  if (vars != null)
  {
@@ -8057,6 +8083,8 @@
  {
  totalOnlineTime += (System.currentTimeMillis() - _onlineBeginTime) / 1000;
  }
+ if (getMuseumPlayer() != null)
+ {
+ getMuseumPlayer().addData("play_duration", (System.currentTimeMillis() - _museumOnlineTime) / 1000);
+ }
+ _museumOnlineTime = System.currentTimeMillis();
 
  statement.setLong(35, totalOnlineTime);
  statement.setInt(36, getNewbie());
@@ -15909,4 +15937,16 @@
  }
  return _pcAdmin;
  }
+
+ MuseumPlayer _mp = null;
+
+ public MuseumPlayer getMuseumPlayer()
+ {
+ return _mp;
+ }
+
+ public void setMuseumPlayer(MuseumPlayer player)
+ {
+ _mp = player;
+ }
 }
\ No newline at end of file
Index: java/l2r/gameserver/communitybbs/BoardsManager.java
===================================================================
--- java/l2r/gameserver/communitybbs/BoardsManager.java (revision 3)
+++ java/l2r/gameserver/communitybbs/BoardsManager.java (working copy)
@@ -28,6 +28,9 @@
 import l2r.gameserver.network.L2GameClient;
 import l2r.gameserver.network.SystemMessageId;
 import l2r.gameserver.network.serverpackets.ShowBoard;
+import museum.MuseumBBSManager;
+import skillsbalancer.SkillsBalanceBBSManager;
+import classbalancer.ClassBalanceBBSManager;
 import gr.reunion.interf.ReunionEvents;
 
 public class BoardsManager
@@ -40,6 +43,28 @@
  return;
  }
 
+ if (command.startsWith("_bbsbalancer") && activeChar.isGM())
+ {
+ ClassBalanceBBSManager.getInstance().cbByPass(command, activeChar);
+ return;
+ }
+
+ if (command.startsWith("_bbsskillsbalancer") && activeChar.isGM())
+ {
+ SkillsBalanceBBSManager.getInstance().cbByPass(command, activeChar);
+ return;
+ }
+
+ if (command.startsWith("_bbshome") || command.startsWith("_bbstop") || command.startsWith("_bbsmuseum"))
+ {
+ if (!command.startsWith("_bbsmuseum"))
+ {
+ command = "_bbsmuseum";
+ }
+ MuseumBBSManager.getInstance().cbByPass(command, activeChar);
+ return;
+ }
+
  if (ReunionEvents.cbBypass(activeChar, command))
  {
  return;
Index: java/l2r/gameserver/model/actor/instance/L2GrandBossInstance.java
===================================================================
--- java/l2r/gameserver/model/actor/instance/L2GrandBossInstance.java (revision 3)
+++ java/l2r/gameserver/model/actor/instance/L2GrandBossInstance.java (working copy)
@@ -108,6 +108,7 @@
  {
  Hero.getInstance().setRBkilled(member.getObjectId(), getId());
  }
+ member.getMuseumPlayer().addData("raid_kill_" + getId(), 1);
  }
  }
  else
@@ -117,6 +118,7 @@
  {
  Hero.getInstance().setRBkilled(player.getObjectId(), getId());
  }
+ player.getMuseumPlayer().addData("raid_kill_" + getId(), 1);
  }
  }
  return true;
Index: java/l2r/gameserver/GameServer.java
===================================================================
--- java/l2r/gameserver/GameServer.java (revision 3)
+++ java/l2r/gameserver/GameServer.java (working copy)
@@ -138,6 +138,7 @@
 import l2r.status.Status;
 import l2r.util.DeadLockDetector;
 import l2r.util.IPv4Filter;
+import museum.MuseumManager;
 
 import org.mmocore.network.SelectorConfig;
 import org.mmocore.network.SelectorThread;
@@ -144,6 +145,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import skillsbalancer.SkillsBalanceManager;
+import classbalancer.ClassBalanceManager;
 import gr.reunion.configsEngine.ReunionConfigController;
 import gr.reunion.interf.ReunionEvents;
 import gr.reunion.main.PlayerValues;
@@ -260,6 +263,8 @@
  RaidBossPointsManager.getInstance();
  PetData.getInstance();
  CharSummonTable.getInstance().init();
+ ClassBalanceManager.getInstance();
+ SkillsBalanceManager.getInstance();
 
  printSection("Clans");
  ClanTable.getInstance();
@@ -364,6 +369,7 @@
  AutoSpawnHandler.getInstance();
 
  FaenorScriptEngine.getInstance();
+ MuseumManager.getInstance();
  // Init of a cursed weapon manager
 
  _log.info("AutoSpawnHandler: Loaded " + AutoSpawnHandler.getInstance().size() + " handlers in total.");
Index: java/l2r/gameserver/enums/InstanceType.java
===================================================================
--- java/l2r/gameserver/enums/InstanceType.java (revision 3)
+++ java/l2r/gameserver/enums/InstanceType.java (working copy)
@@ -117,7 +117,8 @@
  L2AioNpcInstance(L2Npc),
  L2ServicesManagerInstance(L2NpcInstance),
  L2DonateManagerInstance(L2Npc),
- L2ReunionGkInstance(L2Npc);
+ L2ReunionGkInstance(L2Npc),
+ L2MuseumStatueInstance(L2Npc);
 
  private final InstanceType _parent;
  private final long _typeL;
Index: java/l2r/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- java/l2r/gameserver/network/clientpackets/EnterWorld.java (revision 3)
+++ java/l2r/gameserver/network/clientpackets/EnterWorld.java (working copy)
@@ -80,6 +80,7 @@
 import l2r.gameserver.network.serverpackets.ShortCutInit;
 import l2r.gameserver.network.serverpackets.SkillCoolTime;
 import l2r.gameserver.network.serverpackets.SystemMessage;
+import museum.MuseumManager;
 import gr.reunion.antibotEngine.AntibotSystem;
 import gr.reunion.configsEngine.SecuritySystemConfigs;
 import gr.reunion.interf.ReunionEvents;
@@ -608,6 +609,7 @@
  {
  activeChar.sendPacket(ExNotifyPremiumItem.STATIC_PACKET);
  }
+ MuseumManager.getInstance().giveReward(activeChar);
  }
 
  /**
Index: java/l2r/gameserver/handler/AdminCommandHandler.java
===================================================================
--- java/l2r/gameserver/handler/AdminCommandHandler.java (revision 3)
+++ java/l2r/gameserver/handler/AdminCommandHandler.java (working copy)
@@ -96,6 +96,8 @@
 import l2r.gameserver.scripts.handlers.admincommandhandlers.AdminUnblockIp;
 import l2r.gameserver.scripts.handlers.admincommandhandlers.AdminVitality;
 import l2r.gameserver.scripts.handlers.admincommandhandlers.AdminZone;
+import skillsbalancer.AdminSkillsBalancer;
+import classbalancer.AdminClassBalancer;
 
 /**
  * @author UnAfraid
@@ -117,6 +119,7 @@
  registerHandler(new AdminCheckBots());
  registerHandler(new AdminCHSiege());
  registerHandler(new AdminClan());
+ registerHandler(new AdminClassBalancer());
  registerHandler(new AdminCreateItem());
  registerHandler(new AdminCursedWeapons());
  registerHandler(new AdminCustomCreateItem());
@@ -173,6 +176,7 @@
  registerHandler(new AdminShutdown());
  registerHandler(new AdminSiege());
  registerHandler(new AdminSkill());
+ registerHandler(new AdminSkillsBalancer());
  registerHandler(new AdminSpawn());
  registerHandler(new AdminSummon());
  registerHandler(new AdminTarget());
Index: java/l2r/gameserver/model/L2Party.java
===================================================================
--- java/l2r/gameserver/model/L2Party.java (revision 3)
+++ java/l2r/gameserver/model/L2Party.java (working copy)
@@ -854,7 +854,7 @@
  }
 
  addexp = calculateExpSpPartyCutoff(member.getActingPlayer(), topLvl, addexp, addsp, useVitalityRate);
-
+ member.getMuseumPlayer().addData("monster_kill_xp", addexp);
  if (addexp > 0)
  {
  member.updateVitalityPoints(vitalityPoints, true, false);
Index: java/l2r/Config.java
===================================================================
--- java/l2r/Config.java (revision 3)
+++ java/l2r/Config.java (working copy)
@@ -642,6 +642,14 @@
  public static long BOTREPORT_REPORT_DELAY;
  public static boolean BOTREPORT_ALLOW_REPORTS_FROM_SAME_CLAN_MEMBERS;
 
+ public static long CLASS_BALANCER_UPDATE_DELAY;
+ public static boolean CLASS_BALANCER_AFFECTS_SECOND_PROFFESION;
+ public static boolean CLASS_BALANCER_AFFECTS_MONSTERS;
+
+ public static long SKILLS_BALANCER_UPDATE_DELAY;
+ public static boolean SKILLS_BALANCER_AFFECTS_SECOND_PROFFESION;
+ public static boolean SKILLS_BALANCER_AFFECTS_MONSTERS;
+
  // --------------------------------------------------
  // FloodProtector Settings
  // --------------------------------------------------
@@ -2053,6 +2061,14 @@
  BOTREPORT_REPORT_DELAY = General.getInt("BotReportDelay", 30) * 60000;
  BOTREPORT_ALLOW_REPORTS_FROM_SAME_CLAN_MEMBERS = General.getBoolean("AllowReportsFromSameClanMembers", false);
 
+ CLASS_BALANCER_UPDATE_DELAY = General.getLong("ClassBalancerUpdateDelay", 300) * 1000;
+ CLASS_BALANCER_AFFECTS_SECOND_PROFFESION = General.getBoolean("ClassBalancerAffectSecondProffesion", false);
+ CLASS_BALANCER_AFFECTS_MONSTERS = General.getBoolean("ClassBalancerAffectMonsters", false);
+
+ SKILLS_BALANCER_UPDATE_DELAY = General.getLong("SkillsBalancerUpdateDelay", 300) * 1000;
+ SKILLS_BALANCER_AFFECTS_SECOND_PROFFESION = General.getBoolean("SkillsBalancerAffectSecondProffesion", false);
+ SKILLS_BALANCER_AFFECTS_MONSTERS = General.getBoolean("SkillsBalancerAffectMonsters", false);
+
  // Load FloodProtector L2Properties file
  final PropertiesParser FloodProtectors = new PropertiesParser(FLOOD_PROTECTOR_FILE);
 
Index: java/l2r/gameserver/model/quest/QuestState.java
===================================================================
--- java/l2r/gameserver/model/quest/QuestState.java (revision 3)
+++ java/l2r/gameserver/model/quest/QuestState.java (working copy)
@@ -1163,6 +1163,7 @@
  getQuest().removeRegisteredQuestItems(_player);
 
  Quest.deleteQuestInDb(this, repeatable);
+ _player.getMuseumPlayer().addData("quests_clear", 1);
  if (repeatable)
  {
  _player.delQuestState(getQuestName());
Index: java/l2r/gameserver/network/serverpackets/CharSelectionInfo.java
===================================================================
--- java/l2r/gameserver/network/serverpackets/CharSelectionInfo.java (revision 3)
+++ java/l2r/gameserver/network/serverpackets/CharSelectionInfo.java (working copy)
@@ -213,7 +213,7 @@
  }
  }
 
- private static CharSelectInfoPackage[] loadCharacterSelectInfo(String loginName)
+ public static CharSelectInfoPackage[] loadCharacterSelectInfo(String loginName)
  {
  CharSelectInfoPackage charInfopackage;
  List<CharSelectInfoPackage> characterList = new FastList<>();
Index: java/l2r/gameserver/model/actor/L2Npc.java
===================================================================
--- java/l2r/gameserver/model/actor/L2Npc.java (revision 3)
+++ java/l2r/gameserver/model/actor/L2Npc.java (working copy)
@@ -99,6 +99,7 @@
 import l2r.gameserver.util.Broadcast;
 import l2r.gameserver.util.Util;
 import l2r.util.Rnd;
+import museum.L2MuseumStatueInstance;
 import gr.reunion.antibotEngine.AntibotSystem;
 import gr.reunion.configsEngine.CustomServerConfigs;
 import gr.reunion.configsEngine.PremiumServiceConfigs;
@@ -471,7 +472,7 @@
  */
  public boolean hasRandomAnimation()
  {
- return ((Config.MAX_NPC_ANIMATION > 0) && _isRandomAnimationEnabled && !getAiType().equals(AIType.CORPSE));
+ return ((Config.MAX_NPC_ANIMATION > 0) && _isRandomAnimationEnabled && !getAiType().equals(AIType.CORPSE)) && !(this instanceof L2MuseumStatueInstance);
  }
 
  /**
Index: java/l2r/gameserver/network/serverpackets/AbstractNpcInfo.java
===================================================================
--- java/l2r/gameserver/network/serverpackets/AbstractNpcInfo.java (revision 3)
+++ java/l2r/gameserver/network/serverpackets/AbstractNpcInfo.java (working copy)
@@ -39,6 +39,8 @@
 import l2r.gameserver.model.actor.instance.L2TrapInstance;
 import l2r.gameserver.model.actor.templates.L2PcTemplate;
 import l2r.gameserver.model.effects.AbnormalEffect;
+import l2r.gameserver.model.itemcontainer.Inventory;
+import museum.L2MuseumStatueInstance;
 import gr.reunion.datatables.FakePcsTable;
 
 public abstract class AbstractNpcInfo extends L2GameServerPacket
@@ -149,16 +151,161 @@
  _displayEffect = cha.getDisplayEffect();
  }
 
+ private static final int[] PAPERDOLL_ORDER = new int[]
+ {
+ Inventory.PAPERDOLL_UNDER,
+ Inventory.PAPERDOLL_HEAD,
+ Inventory.PAPERDOLL_RHAND,
+ Inventory.PAPERDOLL_LHAND,
+ Inventory.PAPERDOLL_GLOVES,
+ Inventory.PAPERDOLL_CHEST,
+ Inventory.PAPERDOLL_LEGS,
+ Inventory.PAPERDOLL_FEET,
+ Inventory.PAPERDOLL_CLOAK,
+ Inventory.PAPERDOLL_RHAND,
+ Inventory.PAPERDOLL_HAIR,
+ Inventory.PAPERDOLL_HAIR2,
+ Inventory.PAPERDOLL_RBRACELET,
+ Inventory.PAPERDOLL_LBRACELET,
+ Inventory.PAPERDOLL_DECO1,
+ Inventory.PAPERDOLL_DECO2,
+ Inventory.PAPERDOLL_DECO3,
+ Inventory.PAPERDOLL_DECO4,
+ Inventory.PAPERDOLL_DECO5,
+ Inventory.PAPERDOLL_DECO6,
+ Inventory.PAPERDOLL_BELT
+ };
+
  @Override
  protected void writeImpl()
  {
  FakePc fpc = FakePcsTable.getInstance().getFakePc(_npc.getId());
- if (fpc != null)
+
+ if (_npc instanceof L2MuseumStatueInstance)
  {
+ L2MuseumStatueInstance statue = (L2MuseumStatueInstance) _npc;
  writeC(0x31);
  writeD(_x);
  writeD(_y);
  writeD(_z);
+ writeD(0);
+ writeD(_npc.getObjectId());
+ writeS(statue.getCharLooks().getName());
+ writeD(statue.getCharLooks().getRace());
+ writeD(statue.getCharLooks().getSex());
+ writeD(statue.getCharLooks().getBaseClassId());
+
+ for (int slot : PAPERDOLL_ORDER)
+ {
+ writeD(statue.getCharLooks().getPaperdollItemId(slot));
+ }
+
+ for (int element : PAPERDOLL_ORDER)
+ {
+ writeD(0);
+ }
+
+ writeD(0);
+ writeD(0);
+
+ writeD(0);
+ writeD(0);
+
+ writeD(_mAtkSpd);
+ writeD(_pAtkSpd);
+
+ writeD(0x00); // ?
+
+ writeD(_runSpd);
+ writeD(_walkSpd);
+ writeD(_swimRunSpd);
+ writeD(_swimWalkSpd);
+ writeD(_flyRunSpd);
+ writeD(_flyWalkSpd);
+ writeD(_flyRunSpd);
+ writeD(_flyWalkSpd);
+ writeF(_moveMultiplier);
+ writeF(0);
+ L2PcTemplate cl = CharTemplateData.getInstance().getTemplate(statue.getCharLooks().getBaseClassId());
+ writeF(statue.getCharLooks().getSex() == 1 ? cl.getFCollisionRadiusFemale() : cl.getfCollisionRadius());
+ writeF(statue.getCharLooks().getSex() == 1 ? cl.getFCollisionHeightFemale() : cl.getfCollisionHeight());
+
+ writeD(statue.getCharLooks().getHairStyle());
+ writeD(statue.getCharLooks().getHairColor());
+ writeD(statue.getCharLooks().getFace());
+
+ writeS(_npc.getTitle());
+
+ writeD(0);
+ writeD(0);
+ writeD(0);
+ writeD(0);
+
+ writeC(1); // standing = 1 sitting = 0
+ writeC(0); // running = 1 walking = 0
+ writeC(0);
+
+ writeC(0);
+
+ writeC(0); // invisible = 1 visible =0
+
+ writeC(0); // 1-on Strider, 2-on Wyvern, 3-on Great Wolf, 0-no mount
+ writeC(1);
+
+ writeH(0);
+
+ writeC(0);
+
+ writeD(AbnormalEffect.HOLD_1.getMask());
+
+ writeC(0);
+
+ writeH(0); // Blue value for name (0 = white, 255 = pure blue)
+ writeD(0);
+ writeD(statue.getCharLooks().getClassId());
+ writeD(0x00); // ?
+ writeC(statue.getCharLooks().getEnchantEffect());
+
+ writeC(0);
+
+ writeD(0);
+ writeC(0); // Symbol on char menu ctrl+I
+ writeC(0); // Hero Aura
+
+ writeC(0); // 0x01: Fishing Mode (Cant be undone by setting back to 0)
+ writeD(0);
+ writeD(0);
+ writeD(0);
+
+ writeD(0xFFFFFF);
+
+ writeD(_heading);
+
+ writeD(0);
+ writeD(0);
+
+ writeD(0x7d7d7b);
+
+ writeD(0);
+
+ writeD(0);
+
+ // T1
+ writeD(0);
+ writeD(0);
+
+ // T2
+ writeD(0x01);
+
+ // T2.3
+ writeD(0);
+ }
+ else if (fpc != null)
+ {
+ writeC(0x31);
+ writeD(_x);
+ writeD(_y);
+ writeD(_z);
  writeD(0x00); // vehicle id
  writeD(_npc.getObjectId());
  writeS(fpc.name); // visible name
Index: .classpath
===================================================================
--- .classpath (revision 3)
+++ .classpath (working copy)
@@ -20,5 +20,8 @@
  <classpathentry kind="lib" path="dist/libs/mchange-commons-java-0.2.7.jar"/>
  <classpathentry kind="lib" path="dist/libs/weupnp-0.1.3.jar"/>
  <classpathentry kind="lib" path="dist/libs/L2J_GeoAbstraction.jar"/>
+ <classpathentry kind="lib" path="dist/libs/ClassBalancer.jar"/>
+ <classpathentry kind="lib" path="dist/libs/SkillsBalancer.jar"/>
+ <classpathentry kind="lib" path="dist/libs/MuseumManager.jar"/>
  <classpathentry kind="output" path="bin"/>
 </classpath>
Index: java/l2r/gameserver/model/actor/L2Attackable.java
===================================================================
--- java/l2r/gameserver/model/actor/L2Attackable.java (revision 3)
+++ java/l2r/gameserver/model/actor/L2Attackable.java (working copy)
@@ -379,6 +379,11 @@
  {
  mob.getMinionList().onMasterDie(false);
  }
+ if (killer instanceof L2PcInstance)
+ {
+ L2PcInstance player = (L2PcInstance) killer;
+ player.getMuseumPlayer().addData("monster_kills", 1);
+ }
  }
  return true;
  }
@@ -545,6 +550,7 @@
  final long addexp = Math.round(attacker.calcStat(Stats.EXPSP_RATE, exp, null, null));
  final int addsp = (int) attacker.calcStat(Stats.EXPSP_RATE, sp, null, null);
 
+ attacker.getMuseumPlayer().addData("monster_kill_xp", addexp);
  attacker.addExpAndSp(addexp, addsp, useVitalityRate());
  if (addexp > 0)
  {
Index: java/l2r/gameserver/model/actor/stat/PcStat.java
===================================================================
--- java/l2r/gameserver/model/actor/stat/PcStat.java (revision 3)
+++ java/l2r/gameserver/model/actor/stat/PcStat.java (working copy)
@@ -208,7 +208,7 @@
  {
  return false;
  }
-
+ activeChar.getMuseumPlayer().addData("xp", addToExp);
  SystemMessage sm = null;
  if ((addToExp == 0) && (addToSp != 0))
  {
Index: java/l2r/gameserver/model/actor/instance/L2RaidBossInstance.java
===================================================================
--- java/l2r/gameserver/model/actor/instance/L2RaidBossInstance.java (revision 3)
+++ java/l2r/gameserver/model/actor/instance/L2RaidBossInstance.java (working copy)
@@ -121,6 +121,7 @@
  {
  Hero.getInstance().setRBkilled(member.getObjectId(), getId());
  }
+ member.getMuseumPlayer().addData("raid_kill_" + getId(), 1);
  }
  }
  else
@@ -130,6 +131,7 @@
  {
  Hero.getInstance().setRBkilled(player.getObjectId(), getId());
  }
+ player.getMuseumPlayer().addData("raid_kill_" + getId(), 1);
  }
  }
 
Index: java/l2r/gameserver/model/stats/Formulas.java
===================================================================
--- java/l2r/gameserver/model/stats/Formulas.java (revision 3)
+++ java/l2r/gameserver/model/stats/Formulas.java (working copy)
@@ -39,6 +39,8 @@
 import l2r.gameserver.model.StatsSet;
 import l2r.gameserver.model.actor.L2Character;
 import l2r.gameserver.model.actor.L2Npc;
+import l2r.gameserver.model.actor.L2Playable;
+import l2r.gameserver.model.actor.L2Summon;
 import l2r.gameserver.model.actor.instance.L2CubicInstance;
 import l2r.gameserver.model.actor.instance.L2PcInstance;
 import l2r.gameserver.model.actor.instance.L2PetInstance;
@@ -84,6 +86,8 @@
 import l2r.gameserver.network.serverpackets.SystemMessage;
 import l2r.gameserver.util.Util;
 import l2r.util.Rnd;
+import skillsbalancer.SkillsBalanceManager;
+import classbalancer.ClassBalanceManager;
 import gr.reunion.balanceEngine.BalanceHandler;
 import gr.reunion.configsEngine.FormulasConfigs;
 
@@ -651,6 +655,43 @@
 
  }
 
+ int skillId = skill.getId();
+ double svsAll[] = SkillsBalanceManager.getInstance().getBalance((skillId * -1) - 65536, false);
+ if ((svsAll != null) && (Config.SKILLS_BALANCER_AFFECTS_MONSTERS || (target instanceof L2Playable)))
+ {
+ damage *= svsAll[1];
+ }
+ if ((target instanceof L2PcInstance) || (target instanceof L2Summon))
+ {
+ L2PcInstance t = target instanceof L2PcInstance ? target.getActingPlayer() : ((L2Summon) target).getOwner();
+ int targetClassId = SkillsBalanceManager.getInstance().getClassId(t.getClassId().getId());
+ double vsTarget[] = SkillsBalanceManager.getInstance().getBalance(skillId + (targetClassId * 65536), t.isInOlympiadMode());
+ if (vsTarget != null)
+ {
+ damage *= vsTarget[1];
+ }
+ }
+
+ if ((attacker instanceof L2PcInstance) || (attacker instanceof L2Summon))
+ {
+ L2PcInstance player = attacker instanceof L2PcInstance ? attacker.getActingPlayer() : ((L2Summon) attacker).getOwner();
+ int playerClassId = ClassBalanceManager.getInstance().getClassId(player.getClassId().getId());
+ double vsAll[] = ClassBalanceManager.getInstance().getBalance(playerClassId * -256, false);
+ if ((vsAll != null) && (Config.CLASS_BALANCER_AFFECTS_MONSTERS || (target instanceof L2Playable)))
+ {
+ damage *= vsAll[4];
+ }
+ if ((target instanceof L2PcInstance) || (target instanceof L2Summon))
+ {
+ L2PcInstance t = target instanceof L2PcInstance ? target.getActingPlayer() : ((L2Summon) target).getOwner();
+ int targetClassId = ClassBalanceManager.getInstance().getClassId(t.getClassId().getId());
+ double vsTarget[] = ClassBalanceManager.getInstance().getBalance((playerClassId * 256) + targetClassId, player.isInOlympiadMode());
+ if (vsTarget != null)
+ {
+ damage *= vsTarget[4];
+ }
+ }
+ }
  return Math.max(damage, 1);
  }
 
@@ -925,6 +966,76 @@
  damage = damage * FormulasConfigs.ALT_NPC_PHYSICAL_DAMAGE_MULTI;
  }
 
+ if (skill != null)
+ {
+ int skillId = skill.getId();
+ double svsAll[] = SkillsBalanceManager.getInstance().getBalance((skillId * -1) - 65536, false);
+ if ((svsAll != null) && (Config.SKILLS_BALANCER_AFFECTS_MONSTERS || (target instanceof L2Playable)))
+ {
+ damage *= svsAll[1];
+ }
+ if ((target instanceof L2PcInstance) || (target instanceof L2Summon))
+ {
+ L2PcInstance t = target instanceof L2PcInstance ? target.getActingPlayer() : ((L2Summon) target).getOwner();
+ int targetClassId = SkillsBalanceManager.getInstance().getClassId(t.getClassId().getId());
+ double vsTarget[] = SkillsBalanceManager.getInstance().getBalance(skillId + (targetClassId * 65536), t.isInOlympiadMode());
+ if (vsTarget != null)
+ {
+ damage *= vsTarget[1];
+ }
+ }
+ }
+
+ if ((attacker instanceof L2PcInstance) || (attacker instanceof L2Summon))
+ {
+ L2PcInstance player = attacker instanceof L2PcInstance ? attacker.getActingPlayer() : ((L2Summon) attacker).getOwner();
+ int playerClassId = ClassBalanceManager.getInstance().getClassId(player.getClassId().getId());
+ double vsAll[] = ClassBalanceManager.getInstance().getBalance(playerClassId * -256, false);
+ if ((vsAll != null) && (Config.CLASS_BALANCER_AFFECTS_MONSTERS || (target instanceof L2Playable)))
+ {
+ if ((skill != null) && crit)
+ {
+ damage *= vsAll[6];
+ }
+ else if ((skill != null) && !crit)
+ {
+ damage *= vsAll[5];
+ }
+ else if ((skill == null) && crit)
+ {
+ damage *= vsAll[1];
+ }
+ else if ((skill == null) && !crit)
+ {
+ damage *= vsAll[0];
+ }
+ }
+ if ((target instanceof L2PcInstance) || (target instanceof L2Summon))
+ {
+ L2PcInstance t = target instanceof L2PcInstance ? target.getActingPlayer() : ((L2Summon) target).getOwner();
+ int targetClassId = ClassBalanceManager.getInstance().getClassId(t.getClassId().getId());
+ double vsTarget[] = ClassBalanceManager.getInstance().getBalance((playerClassId * 256) + targetClassId, player.isInOlympiadMode());
+ if (vsTarget != null)
+ {
+ if ((skill != null) && crit)
+ {
+ damage *= vsTarget[6];
+ }
+ else if ((skill != null) && !crit)
+ {
+ damage *= vsTarget[5];
+ }
+ else if ((skill == null) && crit)
+ {
+ damage *= vsTarget[1];
+ }
+ else if ((skill == null) && !crit)
+ {
+ damage *= vsTarget[0];
+ }
+ }
+ }
+ }
  return damage;
  }
 
@@ -1058,6 +1169,43 @@
  damage = damage * FormulasConfigs.ALT_NPC_MAGICAL_DAMAGE_MULTI;
  }
 
+ int skillId = skill.getId();
+ double svsAll[] = SkillsBalanceManager.getInstance().getBalance((skillId * -1) - 65536, false);
+ if ((svsAll != null) && (Config.SKILLS_BALANCER_AFFECTS_MONSTERS || (target instanceof L2Playable)))
+ {
+ damage *= svsAll[1];
+ }
+ if ((target instanceof L2PcInstance) || (target instanceof L2Summon))
+ {
+ L2PcInstance t = target instanceof L2PcInstance ? target.getActingPlayer() : ((L2Summon) target).getOwner();
+ int targetClassId = SkillsBalanceManager.getInstance().getClassId(t.getClassId().getId());
+ double vsTarget[] = SkillsBalanceManager.getInstance().getBalance(skillId + (targetClassId * 65536), t.isInOlympiadMode());
+ if (vsTarget != null)
+ {
+ damage *= vsTarget[1];
+ }
+ }
+
+ if ((attacker instanceof L2PcInstance) || (attacker instanceof L2Summon))
+ {
+ L2PcInstance player = attacker instanceof L2PcInstance ? attacker.getActingPlayer() : ((L2Summon) attacker).getOwner();
+ int playerClassId = ClassBalanceManager.getInstance().getClassId(player.getClassId().getId());
+ double vsAll[] = ClassBalanceManager.getInstance().getBalance(playerClassId * -256, false);
+ if ((vsAll != null) && (Config.CLASS_BALANCER_AFFECTS_MONSTERS || (target instanceof L2Playable)))
+ {
+ damage *= mcrit ? vsAll[3] : vsAll[2];
+ }
+ if ((target instanceof L2PcInstance) || (target instanceof L2Summon))
+ {
+ L2PcInstance t = target instanceof L2PcInstance ? target.getActingPlayer() : ((L2Summon) target).getOwner();
+ int targetClassId = ClassBalanceManager.getInstance().getClassId(t.getClassId().getId());
+ double vsTarget[] = ClassBalanceManager.getInstance().getBalance((playerClassId * 256) + targetClassId, player.isInOlympiadMode());
+ if (vsTarget != null)
+ {
+ damage *= mcrit ? vsTarget[3] : vsTarget[2];
+ }
+ }
+ }
  return damage;
  }
 
@@ -1717,6 +1865,23 @@
  rate *= mAtkMod;
  double finalRate = Math.min(Math.max(rate, skill.getMinChance()), skill.getMaxChance());
 
+ int skillId = skill.getId();
+ double svsAll[] = SkillsBalanceManager.getInstance().getBalance((skillId * -1) - 65536, false);
+ if ((svsAll != null) && (Config.SKILLS_BALANCER_AFFECTS_MONSTERS || (target instanceof L2Playable)))
+ {
+ finalRate *= svsAll[0];
+ }
+ if ((target instanceof L2PcInstance) || (target instanceof L2Summon))
+ {
+ L2PcInstance t = target instanceof L2PcInstance ? target.getActingPlayer() : ((L2Summon) target).getOwner();
+ int targetClassId = SkillsBalanceManager.getInstance().getClassId(t.getClassId().getId());
+ double vsTarget[] = SkillsBalanceManager.getInstance().getBalance(skillId + (targetClassId * 65536), t.isInOlympiadMode());
+ if (vsTarget != null)
+ {
+ finalRate *= vsTarget[0];
+ }
+ }
+
  if (attacker.isDebug() || Config.DEVELOPER)
  {
  final StatsSet set = new StatsSet();
Index: dist/game/data/MuseumCategories.xml
===================================================================
--- dist/game/data/MuseumCategories.xml (revision 0)
+++ dist/game/data/MuseumCategories.xml (working copy)
@@ -0,0 +1,36 @@
+<list>
+ <set name="refreshAllStatisticsIn" val="3600" />
+ <category name="General">
+ <type name="Acquired XP" type="xp" refreshTime="weekly">
+ <spawn x="1000" y="1000" z="1000" heading="1000" />
+ </type>
+ <type name="Acquired Adena" type="adena" refreshTime="monthly"/>
+ <type name="Play Duration" type="play_duration" refreshTime="daily" timer="true">
+ <spawn x="28529" y="10573" z="-4234" heading="1000" />
+ </type>
+ <type name="Private Store Sales" type="private_stores_sales" refreshTime="weekly" additionalText="Round(s)"/>
+ <type name="Quests Clear" type="quests_clear" refreshTime="weekly" additionalText="Round(s)"/>
+ </category>
+ <category name="Hunting Grounds">
+ <type name="Number of Monster Killings" type="monster_kills" refreshTime="total" additionalText="Round(s)" >
+ <spawn x="28892" y="11029" z="-4233" heading="1000" />
+ <reward type="Experience" min="500000" max="1000000" chance="100"/>
+ <reward type="ClanPoints" min="500" max="1000" chance="100" />
+ <reward type="SkillPoints" min="500000" max="1000000" chance="100"/>
+ <reward id="57" type="Item" min="30" max="40" chance="100" party="true"/>
+ </type>
+ <type name="Monster Kill XP" type="monster_kill_xp" refreshTime="daily" />
+ <type name="Number of Deaths by Monsters" type="monster_deaths" refreshTime="total" additionalText="Round(s)" />
+ </category>
+ <category name="Raid">
+ <type name="Baium" type="raid_kill_22222" refreshTime="total" additionalText="Round(s)" />
+ <type name="Antharas" type="raid_kill_22222" refreshTime="total" additionalText="Round(s)" />
+ <type name="Valakas" type="raid_kill_22222" refreshTime="total" additionalText="Round(s)" />
+ </category>
+ <category name="PVP">
+ <type name="PK Victory Count" type="pk_victories" refreshTime="total" additionalText="People" />
+ <type name="PvP Victory Count" type="pvp_victories" refreshTime="total" additionalText="People" />
+ <type name="PK Defeat Count" type="pk_defeats" refreshTime="total" additionalText="Round(s)" />
+ <type name="PvP Defeat Count" type="pvp_defeats" refreshTime="total" additionalText="Round(s)" />
+ </category>
+</list>
\ No newline at end of file
Index: java/l2r/gameserver/network/clientpackets/RequestPrivateStoreBuy.java
===================================================================
--- java/l2r/gameserver/network/clientpackets/RequestPrivateStoreBuy.java (revision 3)
+++ java/l2r/gameserver/network/clientpackets/RequestPrivateStoreBuy.java (working copy)
@@ -151,7 +151,7 @@
  }
  return;
  }
-
+ storePlayer.getMuseumPlayer().addData("private_stores_sales", _items.size());
  if (storeList.getItemCount() == 0)
  {
  storePlayer.setPrivateStoreType(PrivateStoreType.NONE);
Index: java/l2r/gameserver/Shutdown.java
===================================================================
--- java/l2r/gameserver/Shutdown.java (revision 3)
+++ java/l2r/gameserver/Shutdown.java (working copy)
@@ -47,6 +47,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import skillsbalancer.SkillsBalanceManager;
+import classbalancer.ClassBalanceManager;
 import gr.reunion.backupManager.DatabaseBackupManager;
 import gr.reunion.configsEngine.BackupManagerConfigs;
 import gr.reunion.configsEngine.LeaderboardsConfigs;
@@ -223,6 +225,26 @@
 
  try
  {
+ ClassBalanceManager.getInstance().updateBalances();
+ _log.info("Class Balancer: Class Balances updated to database (" + tc.getEstimatedTimeAndRestartCounter() + "ms).");
+ }
+ catch (Throwable t)
+ {
+ _log.warn("Error while updating class balances to database: ", t);
+ }
+
+ try
+ {
+ SkillsBalanceManager.getInstance().updateBalances();
+ _log.info("Skills Balancer: Skill Balances updated to database (" + tc.getEstimatedTimeAndRestartCounter() + "ms).");
+ }
+ catch (Throwable t)
+ {
+ _log.warn("Error while updating skill balances to database: ", t);
+ }
+
+ try
+ {
  disconnectAllCharacters();
  _log.info("All players disconnected and saved(" + tc.getEstimatedTimeAndRestartCounter() + "ms).");
  }
### Eclipse Workspace Patch 1.0
#P L2J_ReunionProject_Core
Index: java/l2r/gameserver/network/serverpackets/CharSelectionInfo.java
===================================================================
--- java/l2r/gameserver/network/serverpackets/CharSelectionInfo.java (revision 3)
+++ java/l2r/gameserver/network/serverpackets/CharSelectionInfo.java (working copy)
@@ -265,7 +265,7 @@
  }
  }
 
- private static CharSelectInfoPackage restoreChar(ResultSet chardata) throws Exception
+ public static CharSelectInfoPackage restoreChar(ResultSet chardata) throws Exception
  {
  int objectId = chardata.getInt("charId");
  String name = chardata.getString("char_name");

CitarSQL
/*
Navicat MySQL Data Transfer

Source Server         : 127.0.0.1_3306
Source Server Version : 50622
Source Host           : 127.0.0.1:3306
Source Database       : l2j

Target Server Type    : MYSQL
Target Server Version : 50622
File Encoding         : 65001

Date: 2015-02-20 02:05:40
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for museum_last_statistics
-- ----------------------------
DROP TABLE IF EXISTS `museum_last_statistics`;
CREATE TABLE `museum_last_statistics` (
  `objectId` int(10) NOT NULL DEFAULT '0',
  `name` varchar(50) NOT NULL,
  `category` varchar(50) NOT NULL DEFAULT '',
  `timer` varchar(15) NOT NULL,
  `count` bigint(13) NOT NULL DEFAULT '0',
  PRIMARY KEY (`objectId`,`category`,`timer`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for museum_statistics
-- ----------------------------
DROP TABLE IF EXISTS `museum_statistics`;
CREATE TABLE `museum_statistics` (
  `objectId` int(10) unsigned NOT NULL DEFAULT '0',
  `name` varchar(50) NOT NULL,
  `category` varchar(30) NOT NULL,
  `monthly_count` bigint(13) NOT NULL DEFAULT '0',
  `weekly_count` bigint(13) NOT NULL DEFAULT '0',
  `daily_count` bigint(13) NOT NULL DEFAULT '0',
  `total_count` bigint(13) NOT NULL DEFAULT '0',
  `hasReward` smallint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`objectId`,`category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;