Hikari 48 Опубликовано 17 мая, 2014 Попытался сделать проверку на ПА (130 строка) package events.CustomDropItems; import l2ft.commons.util.Rnd; import l2ft.gameserver.Config; import l2ft.gameserver.listener.actor.OnDeathListener; import l2ft.gameserver.model.Creature; import l2ft.gameserver.model.actor.listener.CharListenerList; import l2ft.gameserver.model.instances.MonsterInstance; import l2ft.gameserver.model.instances.NpcInstance; import l2ft.gameserver.model.instances.RaidBossInstance; import l2ft.gameserver.scripts.Functions; import l2ft.gameserver.scripts.ScriptFile; import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CustomDropItems extends Functions implements ScriptFile, OnDeathListener { private static final Logger _log = LoggerFactory.getLogger(CustomDropItems.class); private static final int[] DROP = Config.CDItemsId; //айдишники итемов private static final int[] CDItemsCountDropMin = Config.CDItemsCountDropMin;// мин кол-во private static final int[] CDItemsCountDropMax = Config.CDItemsCountDropMax;// макс кол-во private static final double[] CustomDropItemsChance = Config.CustomDropItemsChance;// шанс дропа private static boolean ALLOW_MIN_MAX_PLAYER_LVL = Config.CDItemsAllowMinMaxPlayerLvl;// проверка на лвл чара private static final int MIN_PLAYER_LVL = Config.CDItemsMinPlayerLvl;// мин уровень чара private static final int MAX_PLAYER_LVL = Config.CDItemsMaxPlayerLvl;// макс уровень чара private static boolean ALLOW_MIN_MAX_MOB_LVL = Config.CDItemsAllowMinMaxMobLvl;// проверка на лвл моба private static final int MIN_MOB_LVL = Config.CDItemsMinMobLvl;// мин уровень моба private static final int MAX_MOB_LVL = Config.CDItemsMaxMobLvl;// макс уровень моба private static boolean ALLOW_ONLY_RB_DROPS = Config.CDItemsAllowOnlyRbDrops;// дроп только с рб private static final int[] FORBID_MOBS_ID = { 22829 }; private static boolean _active = false; @Override public void onLoad()// загрузка { CharListenerList.addGlobal(this); if(Config.AllowCustomDropItems) { _active = true; _log.info("Loaded CustomDropItems: CustomDropItems [state: activated]"); } else _log.info("Loaded CustomDropItems: CustomDropItems [state: deactivated]"); } @Override public void onReload() { } @Override public void onShutdown() { } @Override public void onDeath(Creature cha, Creature killer)//проверки при сметри моба { if(!ALLOW_ONLY_RB_DROPS)//если дроп не с РБ { if((ALLOW_MIN_MAX_PLAYER_LVL && checkValidate(killer, cha, true, false)) && (ALLOW_MIN_MAX_MOB_LVL && checkValidate(killer, cha, false, true))) { dropItemMob(cha, killer); } else if((ALLOW_MIN_MAX_PLAYER_LVL && checkValidate(killer, cha, true, false)) && !ALLOW_MIN_MAX_MOB_LVL) { dropItemMob(cha, killer); } else if(!ALLOW_MIN_MAX_PLAYER_LVL && (ALLOW_MIN_MAX_MOB_LVL && checkValidate(killer, cha, false, true))) { dropItemMob(cha, killer); } else if(!ALLOW_MIN_MAX_PLAYER_LVL && !ALLOW_MIN_MAX_MOB_LVL) { dropItemMob(cha, killer); } else return; } else if(ALLOW_ONLY_RB_DROPS && (cha.isRaid() || cha.isBoss()))//если дроп с рб { if((ALLOW_MIN_MAX_PLAYER_LVL && checkValidate(killer, cha, true, false)) && (ALLOW_MIN_MAX_MOB_LVL && checkValidate(killer, cha, false, true))) { dropItemRb(cha, killer); } else if((ALLOW_MIN_MAX_PLAYER_LVL && checkValidate(killer, cha, true, false)) && !ALLOW_MIN_MAX_MOB_LVL) { dropItemRb(cha, killer); } else if(!ALLOW_MIN_MAX_PLAYER_LVL && (ALLOW_MIN_MAX_MOB_LVL && checkValidate(killer, cha, false, true))) { dropItemRb(cha, killer); } else if(!ALLOW_MIN_MAX_PLAYER_LVL && !ALLOW_MIN_MAX_MOB_LVL) { dropItemRb(cha, killer); } else return; } else return; } private boolean checkValidate(Creature killer, Creature mob, boolean lvlPlayer, boolean lvlMob)//проверки { if(mob == null || killer == null) return false; if(lvlPlayer && (killer.getLevel() >= MIN_PLAYER_LVL && killer.getLevel() <= MAX_PLAYER_LVL)) return true; if(lvlMob && (mob.getLevel() >= MIN_MOB_LVL && mob.getLevel() <= MAX_MOB_LVL)) return true; return false; } private void dropItemMob(Creature cha, Creature killer)//добавляем дроп в моба { long pa_bonus = 0; if(killer.getPlayer().hasBonus()) { pa_bonus = 4L; } if(_active && SimpleCheckDrop(cha, killer) && !ArrayUtils.contains(FORBID_MOBS_ID, cha.getNpcId())) { for(int i = 0; i < DROP.length; i++){ if(Rnd.chance(CustomDropItemsChance * killer.getPlayer().getRateItems() * ((MonsterInstance) cha).getTemplate().rateHp)){ ((MonsterInstance) cha).dropItem(killer.getPlayer(), DROP, Rnd.get(CDItemsCountDropMin+pa_bonus, CDItemsCountDropMax+pa_bonus)); } } } else { return; } } private void dropItemRb(Creature cha, Creature killer)// добавляем дроп в рб { if(_active && ALLOW_ONLY_RB_DROPS) for(int i = 0; i < DROP.length; i++) if(Rnd.chance(CustomDropItemsChance * killer.getPlayer().getRateItems() * ((NpcInstance) cha).getTemplate().rateHp)) ((NpcInstance) cha).dropItem(killer.getPlayer(), DROP, Rnd.get(CDItemsCountDropMin, CDItemsCountDropMax)); else return; } } из-за проверки if(killer.getPlayer().hasBonus()) появляется НПЕ [17.05.14 10:34:05:705] ERROR threading.RunnableImpl: Exception: RunnableImpl.run(): java.lang.NullPointerException java.lang.NullPointerException at events.CustomDropItems.CustomDropItems.dropItemMob(CustomDropItems.java:132) at events.CustomDropItems.CustomDropItems.onDeath(CustomDropItems.java:80) at l2ft.gameserver.model.actor.listener.CharListenerList.onDeath(CharListenerList.java:118) at l2ft.gameserver.model.Creature.onDeath(Creature.java:1667) at l2ft.gameserver.model.instances.NpcInstance.onDeath(NpcInstance.java:319) at l2ft.gameserver.model.instances.MonsterInstance.onDeath(MonsterInstance.java:388) at l2ft.gameserver.model.Creature.doDie(Creature.java:1618) at l2ft.gameserver.model.Creature.onReduceCurrentHp(Creature.java:3226) at l2ft.gameserver.model.instances.NpcInstance.onReduceCurrentHp(NpcInstance.java:293) at l2ft.gameserver.model.instances.MonsterInstance.onReduceCurrentHp(MonsterInstance.java:411) at l2ft.gameserver.model.Creature.reduceCurrentHp(Creature.java:3195) at l2ft.gameserver.model.instances.MonsterInstance.reduceCurrentHp(MonsterInstance.java:924) at l2ft.gameserver.model.Creature.onHitTimer(Creature.java:2987) at l2ft.gameserver.model.GameObjectTasks$HitTask.runImpl(GameObjectTasks.java:318) at l2ft.commons.threading.RunnableImpl.run(RunnableImpl.java:21) 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$201(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Как убрать НПЕ - не знаю. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 17 мая, 2014 По логике, не видя кода, нпе из за отсутствия киллера, либо киллер не плеер. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hikari 48 Опубликовано 17 мая, 2014 (изменено) По логике, не видя кода, нпе из за отсутствия киллера, либо киллер не плеер. спасибо за наводку, проблему решил добавил условие что киллер должен бить плеер Изменено 17 мая, 2014 пользователем Pacifist Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 17 мая, 2014 Автоматически сформированное сообщение Тема закрыта модератором. Причина: Решно Если вы не согласны с закрытием темы, то можете обратиться к администратору. С наилучшими пожеланиями ForumMaxi - Сообщество администраторов онлайн игр Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты