swat809 8 Опубликовано 3 февраля, 2021 (изменено) Доброй ночи! Друзья, вопрос вот такой. Каким образом реализуется добыча ресурсов в игре. На примере la2world.ru Вот есть кирка, и есть камень, нужно именно этой киркой его бить, чтобы получить другой кусок камня. Вот вопрос, как создаётся этот камень, он сравнится как нпс? И как сделать, чтобы его лупить определенным предметом. Спасибо за помощь. Изменено 3 февраля, 2021 пользователем swat809 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Rolo 279 Опубликовано 3 февраля, 2021 Не знаю, указанный Вами проект, но суть, кажется уловил. На самом деле, на что фантазии хватит. Но мне кажется, лучше спавнить как НПС, как Вы и сказали, сделал бы метод, проверяющий, что там на игроке надето как-то так, например: public int getItemEquipped(int loc) { return getPlayer().getInventory().getPaperdollItemId(loc); } Сделал бы проверку НПС по ид, если есть совпадения, чекал бы getItemEquipped(), если есть совпадение - тогда идет расчет шанса дропа и вся остальная магия. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Edgar 356 Опубликовано 4 февраля, 2021 делаем какой нибудь EqipKillListner и подсовуем в монтер инстанс Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
cray 27 Опубликовано 4 февраля, 2021 15 часов назад, swat809 сказал: Доброй ночи! Друзья, вопрос вот такой. Каким образом реализуется добыча ресурсов в игре. На примере la2world.ru Вот есть кирка, и есть камень, нужно именно этой киркой его бить, чтобы получить другой кусок камня. Вот вопрос, как создаётся этот камень, он сравнится как нпс? И как сделать, чтобы его лупить определенным предметом. Спасибо за помощь. Именно бить нужно с определенной киркой или Убить? КОгда ресы даются при киле этого камня, или камень условно бессмертный и шанс чет там добыть есть именно при ударе? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
swat809 8 Опубликовано 4 февраля, 2021 Условно бессмертный. Скажем на пример каждый 2-5 удар дает 1 итем. Спасибо Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Rolo 279 Опубликовано 4 февраля, 2021 swat809, в таком случае нужно метод onHit юзать, а не при смерти чекать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
swat809 8 Опубликовано 4 февраля, 2021 Прости конечно, а есть какой-то мануал? Или пример как это делать, я честно удивлен, что адекватно отвечают) спасибо. 2 часа назад, Rolo сказал: swat809, в таком случае нужно метод onHit юзать, а не при смерти чекать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Rolo 279 Опубликовано 4 февраля, 2021 (изменено) swat809, не видел подобных мануалов. В целом нужно понимание как сборка построена, и джаву тоже понимать, иначе такое лучше самому не делать, я не в том даже ключе, что наугад не получится, - может и получиться, может даже все будет хорошо, но есть вероятность наплодить багов/загрузить систему, особенно если речь о вычислении шанса дропа на каждый удар. ) Если есть представления о джаве и что как работает, посмотрите в ядре, в классе l2PcInstance как устроены промахи/попадания по цели, например, или как вешается дебаф, когда бьешь РБ слишком лоу лвла, это все как раз чекается на каждый удар. Изменено 4 февраля, 2021 пользователем Rolo Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Khrome 276 Опубликовано 4 февраля, 2021 (изменено) package org.mmocore.gameserver.scripts.ai; import org.mmocore.commons.utils.Rnd; import org.mmocore.gameserver.ai.CtrlEvent; import org.mmocore.gameserver.ai.DefaultAI; import org.mmocore.gameserver.data.scripts.Functions; import org.mmocore.gameserver.model.instances.NpcInstance; import org.mmocore.gameserver.network.lineage.components.NpcString; import org.mmocore.gameserver.object.Creature; import org.mmocore.gameserver.skills.SkillEntry; import java.util.List; public class KirkaAi extends DefaultAI { private long _lastAction; private int KirkaNpcId = 1234; //for template public KirkaAi(NpcInstance actor) { super(actor); } @Override protected void onEvtAttacked(final Creature attacker, final SkillEntry skill, final int damage) { NpcInstance actor = getActor(); if (attacker == null || attacker.getPlayer() == null) { return; } // Дропаем не чаще, чем раз в 15 секунд if (System.currentTimeMillis() - _lastAction > 15000) { _lastAction = System.currentTimeMillis(); // //тут вставить метод дропа итема // List<NpcInstance> around = actor.getAroundNpc(1500, 300); if (around != null && !around.isEmpty()) { for (NpcInstance npc : around) { if (npc.isMonster() && npc.getNpcId(KirkaNpcId)) { npc.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, attacker, 5000); } } } } } } Основной смысл думаю понятен. Сообразишь Изменено 4 февраля, 2021 пользователем Khrome 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
swat809 8 Опубликовано 5 февраля, 2021 10 часов назад, Khrome сказал: package org.mmocore.gameserver.scripts.ai; import org.mmocore.commons.utils.Rnd; import org.mmocore.gameserver.ai.CtrlEvent; import org.mmocore.gameserver.ai.DefaultAI; import org.mmocore.gameserver.data.scripts.Functions; import org.mmocore.gameserver.model.instances.NpcInstance; import org.mmocore.gameserver.network.lineage.components.NpcString; import org.mmocore.gameserver.object.Creature; import org.mmocore.gameserver.skills.SkillEntry; import java.util.List; public class KirkaAi extends DefaultAI { private long _lastAction; private int KirkaNpcId = 1234; //for template public KirkaAi(NpcInstance actor) { super(actor); } @Override protected void onEvtAttacked(final Creature attacker, final SkillEntry skill, final int damage) { NpcInstance actor = getActor(); if (attacker == null || attacker.getPlayer() == null) { return; } // Дропаем не чаще, чем раз в 15 секунд if (System.currentTimeMillis() - _lastAction > 15000) { _lastAction = System.currentTimeMillis(); // //тут вставить метод дропа итема // List<NpcInstance> around = actor.getAroundNpc(1500, 300); if (around != null && !around.isEmpty()) { for (NpcInstance npc : around) { if (npc.isMonster() && npc.getNpcId(KirkaNpcId)) { npc.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, attacker, 5000); } } } } } } Основной смысл думаю понятен. Сообразишь Низкий поклон, попробую Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты