Temen
Пользователи-
Публикаций
6 -
Зарегистрирован
-
Посещение
-
Отзывы
0%
Тип контента
Профили
Форумы
Загрузки
Магазин
Инструкции
Весь контент Temen
-
тема по прежнему актуальна , возможно кто то захочет заняться на платной основе?
-
Нашел , не так и не понял какая часть отвечает за поиск id персонажа public class KillListener implements OnKillListener { @Override public void onKill(Creature actor, Creature victim) { Player winner = actor.getPlayer(); if((winner == null) || !victim.isPlayer() || (winner.getLevel() < 40) || (winner == victim) || (victim.getEvent(DominionSiegeEvent.class) == DominionSiegeEvent.this) || !actor.isInZone(Zone.ZoneType.SIEGE) || !victim.isInZone(Zone.ZoneType.SIEGE)) return; winner.setFame(winner.getFame() + Rnd.get(10, 20), DominionSiegeEvent.this.toString()); addReward(winner, KILL_REWARD, 1); if(victim.getLevel() >= 61) { Quest q = _runnerEvent.getClassQuest(((Player) victim).getClassId()); if(q == null) return; QuestState questState = winner.getQuestState(q.getClass()); if(questState == null) { questState = q.newQuestState(winner, Quest.CREATED); q.notifyKill(((Player) victim), questState); } } }
-
Доброго времени суток , хотел попросить помощи в редактировании квеста Dominion_KillSpecialUnitQuest Сборка - Модифицированный Overlord Описание проблемы - квест подразумевает что при убийстве юнитов зареганных за чужой замок игроку дается квестом на убийство 10-15 игроков определенной профессии. Проблема в том что на сборке сделано так что получить за одного и того же персонажа при его убийстве более 1-ого раза кв не засчитывается. Самостоятельно разобраться не получилось. нужно чтобы при убийстве одного персонажа хоть 1 хоть 10 раз кв засчитывался. package quests; import l2p.commons.util.Rnd; import l2p.gameserver.data.xml.holder.EventHolder; import l2p.gameserver.model.Player; import l2p.gameserver.model.base.ClassId; import l2p.gameserver.model.entity.events.EventType; import l2p.gameserver.model.entity.events.impl.DominionSiegeEvent; import l2p.gameserver.model.entity.events.impl.DominionSiegeRunnerEvent; import l2p.gameserver.model.quest.Quest; import l2p.gameserver.model.quest.QuestState; import l2p.gameserver.network.serverpackets.ExShowScreenMessage; import l2p.gameserver.network.serverpackets.components.NpcString; import l2p.gameserver.scripts.ScriptFile; import org.apache.commons.lang3.ArrayUtils; public abstract class Dominion_KillSpecialUnitQuest extends Quest implements ScriptFile { private final ClassId[] _classIds; public Dominion_KillSpecialUnitQuest() { super(PARTY_ALL); _classIds = getTargetClassIds(); DominionSiegeRunnerEvent runnerEvent = EventHolder.getInstance().getEvent(EventType.MAIN_EVENT, 1); for(ClassId c : _classIds) runnerEvent.addClassQuest(c, this); } protected abstract NpcString startNpcString(); protected abstract NpcString progressNpcString(); protected abstract NpcString doneNpcString(); protected abstract int getRandomMin(); protected abstract int getRandomMax(); protected abstract ClassId[] getTargetClassIds(); @Override public String onKill(Player killed, QuestState qs) { Player player = qs.getPlayer(); if(player == null) return null; DominionSiegeEvent event1 = player.getEvent(DominionSiegeEvent.class); if(event1 == null) return null; DominionSiegeEvent event2 = killed.getEvent(DominionSiegeEvent.class); if(event2 == null || event2 == event1) return null; if(!ArrayUtils.contains(_classIds, killed.getClassId())) return null; int max_kills = qs.getInt("max_kills"); if(max_kills == 0) { qs.setState(STARTED); qs.setCond(1); max_kills = Rnd.get(getRandomMin(), getRandomMax()); qs.setMemoState("max_kills", max_kills); qs.setMemoState("current_kills", 1); player.sendPacket(new ExShowScreenMessage(startNpcString(), 2000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER, true, false, String.valueOf(max_kills))); } else { int current_kills = qs.getInt("current_kills") + 1; if(current_kills >= max_kills) { event1.addReward(player, DominionSiegeEvent.STATIC_BADGES, 10); qs.setState(COMPLETED); qs.addExpAndSp(534000, 51000); qs.exitQuest(true); player.sendPacket(new ExShowScreenMessage(doneNpcString(), 2000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER, true, false)); } else { qs.setMemoState("current_kills", current_kills); player.sendPacket(new ExShowScreenMessage(progressNpcString(), 2000, ExShowScreenMessage.ScreenMessageAlign.TOP_CENTER, true, false, String.valueOf(max_kills), String.valueOf(current_kills))); } } return null; } @Override public boolean canAbortByPacket() { return false; } @Override public void onLoad() { } @Override public void onReload() { } @Override public void onShutdown() { } } Буду рад любой помощи или подсказке.
-
Спасибо , помогло . Тему можно закрывать.
-
Можно в любом виде , просто дроп тоже падает с 100% шансом с них и с разницей в уровнях, вполне устроит если будет открыватся но дропа не будет при разнице в лвл >6 . Шанс открытия насколько я понимаю в datapack в скиллах , там стоит 100 но опять же никакого дополнение касаемо разницы в уровнях <skill id="27" levels="14" name="Unlock"> <table name="#itemConsumeCount">2 2 3 3 4 5 6 7 8 10 11 13 15 17</table> <table name="#unlockPower">30 50 75 105 130 175 205 230 275 300 300 300 300 300</table> <table name="#mpConsume2">19 22 25 28 31 35 39 43 47 51 55 59 63 67</table> <table name="#magicLevel">20 24 28 32 36 40 44 48 52 56 60 64 68 72</table> <set name="icon" val="icon.skill0027" /> <set name="reuseDelay" val="30000" /> <set name="magicLevel" val="#magicLevel" /> <set name="hitTime" val="2500" /> <set name="hitCancelTime" val="500" /> <set name="mpConsume2" val="#mpConsume2" /> <set name="activateRate" val="100" /> <set name="unlockPower" val="#unlockPower" /> <set name="itemConsumeId" val="1661" /> <set name="itemConsumeCount" val="#itemConsumeCount" /> <set name="target" val="TARGET_UNLOCKABLE" /> <set name="skillType" val="UNLOCK" /> <set name="operateType" val="OP_ACTIVE" /> </skill> И скилл самого ключика <skill id="22271" levels="1" name="Maestro's Key"> <set name="icon" val="icon.skill0000" /> <set name="reuseDelay" val="3000" /> <set name="hitTime" val="500" /> <set name="hitCancelTime" val="500" /> <set name="activateRate" val="25" /> <set name="itemConsumeId" val="21746" /> <set name="itemConsumeCount" val="1" /> <set name="isHandler" val="true" /> <set name="target" val="TARGET_CHEST" /> <set name="skillType" val="UNLOCK" /> <set name="operateType" val="OP_ACTIVE" /> <cond msgId="109"> <or> <target mobId="18265" /> <target mobId="18266" /> <target mobId="18267" /> <target mobId="18268" /> <target mobId="18269" /> <target mobId="18270" /> <target mobId="18271" /> <target mobId="18272" /> <target mobId="18273" /> <target mobId="18274" /> <target mobId="18275" /> <target mobId="18276" /> <target mobId="18277" /> <target mobId="18278" /> <target mobId="18279" /> <target mobId="18280" /> <target mobId="18281" /> <target mobId="18282" /> <target mobId="18283" /> <target mobId="18284" /> <target mobId="18285" /> <target mobId="18286" /> </or> </cond> </skill>
-
Добрый день , хотел попросить помощи в изменении или за разумную плату переписывания скриптов для Сундуков в исходниках Overlord HF. Суть проблемы в том что имеется скрипт где указано что при разнице в лвл >6(между персонажем и сундуком) шанс открытия сундука 0% , но при этом сундуки открываются скиллом Unlock и собственно ключем при любой разнице лвл (т.е. 40 лвл может открывать 84 сундуки) . Собсно сам скрипт TreasureChestinstance.java @SuppressWarnings("serial") public class TreasureChestInstance extends ChestInstance { private static final int TREASURE_BOMB_ID = 4143; public TreasureChestInstance(int objectId, NpcTemplate template) { super(objectId, template); } public void tryOpen(Player opener, Skill skill) { double chance = calcChance(opener, skill); if(Rnd.chance(chance)) { getAggroList().addDamageHate(opener, 10000, 0); doDie(opener); } else { fakeOpen(opener); } } public double calcChance(Player opener, Skill skill) { double chance = skill.getActivateRate(); int npcLvl = getLevel(); if(!isCommonTreasureChest()) { double levelmod = (double) skill.getMagicLevel() - npcLvl; chance += levelmod * skill.getLevelModifier(); } else { int openerLvl = opener.getLevel(); int lvlDiff = Math.max(openerLvl - npcLvl, 0); if((openerLvl <= 77 && lvlDiff >= 6) || (openerLvl >= 78 && lvlDiff >= 5)) { chance = 0; } } if(chance < 0) { chance = 1; } return chance; } private void fakeOpen(Creature opener) { Skill bomb = SkillTable.getInstance().getInfo(TREASURE_BOMB_ID, getBombLvl()); if(bomb != null) { doCast(bomb, opener, false); } onDecay(); } private int getBombLvl() { int npcLvl = getLevel(); int lvl = 1; if(npcLvl >= 78) { lvl = 10; } else if(npcLvl >= 72) { lvl = 9; } else if(npcLvl >= 66) { lvl = 8; } else if(npcLvl >= 60) { lvl = 7; } else if(npcLvl >= 54) { lvl = 6; } else if(npcLvl >= 48) { lvl = 5; } else if(npcLvl >= 42) { lvl = 4; } else if(npcLvl >= 36) { lvl = 3; } else if(npcLvl >= 30) { lvl = 2; } return lvl; } private boolean isCommonTreasureChest() { int npcId = getNpcId(); if(npcId >= 18265 && npcId <= 18286) return true; return false; } @Override public void onReduceCurrentHp(final double damage, final Creature attacker, Skill skill, final boolean awake, final boolean standUp, boolean directHp) { if(!isCommonTreasureChest()) fakeOpen(attacker); } }