Hikari 48 Опубликовано 26 мая, 2014 [20:02:39] ERROR Exception: RunnableImpl.run(): java.lang.NullPointerException java.lang.NullPointerException at l2ft.gameserver.model.EffectList.getAllFirstEffects(EffectList.java:160) at l2ft.gameserver.model.Player.updateEffectIconsImpl(Player.java:1761) at l2ft.gameserver.model.Player$UpdateEffectIcons.runImpl(Player.java:1731) at l2ft.commons.threading.RunnableImpl.run(RunnableImpl.java:21) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:722) /** * Возвращает первые эффекты для всех скиллов. Нужно для отображения не * более чем 1 иконки для каждого скилла. */ public Effect[] getAllFirstEffects() { if(isEmpty()) return Effect.EMPTY_L2EFFECT_ARRAY; List list = new ArrayList(); int id2=0; int id =0; for(Effect e : _effects) { id = e.getSkill().getId(); if(id!=id2) { e = getEffectsBySkillId(id).get(0); //костыль, в приоритете 1ый эффект list.add(e); } id2 = e.getSkill().getId(); } return list.toArray(new Effect[list.size()]); } Сабж, кто может помочь ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 26 мая, 2014 EffectList.java:160 Что конкретно на 160й строке? 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hikari 48 Опубликовано 26 мая, 2014 EffectList.java:160 Что конкретно на 160й строке? e = getEffectsBySkillId(id).get(0); //костыль, в приоритете 1ый эффект Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 26 мая, 2014 Похоже показатель id не существует 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hikari 48 Опубликовано 26 мая, 2014 Похоже показатель id не существует ну НПЕ вылазит очень редко логично добавить проверку if(id != 0) или нет ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 26 мая, 2014 пробуй 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
YuraAAA1 13 Опубликовано 27 мая, 2014 (изменено) ну НПЕ вылазит очень редко логично добавить проверку if(id != 0) или нет ? нет. List<Effects> effectsList = getEffectsBySkillId(id); if (effectsList != null && !effectsList.isEmpty()) { ... } Изменено 27 мая, 2014 пользователем YuraAAA1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
genokk22 174 Опубликовано 28 мая, 2014 (изменено) На всю эту часть замени. public Effect[] getAllFirstEffects() { if(isEmpty()) return Effect.EMPTY_L2EFFECT_ARRAY; TIntObjectHashMap map = new TIntObjectHashMap(); for(Effect e : _effects) map.put(e.getSkill().getId(), e); return map.values(new Effect[map.size()]); } private void checkSlotLimit(Effect newEffect) { if(_effects == null) return; int slotType = getSlotType(newEffect); if(slotType == NONE_SLOT_TYPE) return; int size = 0; TIntArrayList skillIds = new TIntArrayList(); for(Effect e : _effects) if(e.isInUse()) { if(e.getSkill().equals(newEffect.getSkill())) // мы уже имеем эффект от этого скилла return; if(!skillIds.contains(e.getSkill().getId())) { int subType = getSlotType(e); if(subType == slotType) { size ++; skillIds.add(e.getSkill().getId()); } } } int limit = 0; if(size < limit) return; int skillId = 0; for(Effect e : _effects) if(e.isInUse()) { if(getSlotType(e) == slotType) { skillId = e.getSkill().getId(); break; } } if(skillId != 0) stopEffect(skillId); } Изменено 28 мая, 2014 пользователем genokk22 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hikari 48 Опубликовано 28 мая, 2014 починил, убрав перебор эффектов, спасибо Dislike Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hikari 48 Опубликовано 28 мая, 2014 На всю эту часть замени. public Effect[] getAllFirstEffects() { if(isEmpty()) return Effect.EMPTY_L2EFFECT_ARRAY; TIntObjectHashMap map = new TIntObjectHashMap(); for(Effect e : _effects) map.put(e.getSkill().getId(), e); return map.values(new Effect[map.size()]); } private void checkSlotLimit(Effect newEffect) { if(_effects == null) return; int slotType = getSlotType(newEffect); if(slotType == NONE_SLOT_TYPE) return; int size = 0; TIntArrayList skillIds = new TIntArrayList(); for(Effect e : _effects) if(e.isInUse()) { if(e.getSkill().equals(newEffect.getSkill())) // мы уже имеем эффект от этого скилла return; if(!skillIds.contains(e.getSkill().getId())) { int subType = getSlotType(e); if(subType == slotType) { size ++; skillIds.add(e.getSkill().getId()); } } } int limit = 0; if(size < limit) return; int skillId = 0; for(Effect e : _effects) if(e.isInUse()) { if(getSlotType(e) == slotType) { skillId = e.getSkill().getId(); break; } } if(skillId != 0) stopEffect(skillId); } многовато кода Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hikari 48 Опубликовано 28 мая, 2014 закрывайте Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты