Перейти к содержанию
Авторизация  
swat809

Вопрос к знатокам по high five

Рекомендуемые сообщения

Доброй ночи! Друзья, вопрос вот такой. Каким образом реализуется добыча ресурсов в игре. На примере la2world.ru

Вот есть кирка, и есть камень, нужно именно этой киркой его бить, чтобы получить другой кусок камня. Вот вопрос, как создаётся этот камень, он сравнится как нпс? И как сделать, чтобы его лупить определенным предметом. Спасибо за помощь. 

Изменено пользователем swat809

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю, указанный Вами проект, но суть, кажется уловил. На самом деле, на что фантазии хватит. Но мне кажется, лучше спавнить как НПС, как Вы и  сказали, сделал бы метод, проверяющий, что там на игроке надето как-то так, например: 


    public int getItemEquipped(int loc) {
        return getPlayer().getInventory().getPaperdollItemId(loc);
    }

Сделал бы проверку НПС по ид, если есть совпадения, чекал бы getItemEquipped(), если есть совпадение - тогда идет расчет шанса дропа и вся остальная магия. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

делаем какой нибудь EqipKillListner и  подсовуем в монтер инстанс

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
15 часов назад, swat809 сказал:

Доброй ночи! Друзья, вопрос вот такой. Каким образом реализуется добыча ресурсов в игре. На примере la2world.ru

Вот есть кирка, и есть камень, нужно именно этой киркой его бить, чтобы получить другой кусок камня. Вот вопрос, как создаётся этот камень, он сравнится как нпс? И как сделать, чтобы его лупить определенным предметом. Спасибо за помощь. 

Именно бить нужно с определенной киркой или Убить? КОгда ресы даются при киле этого камня, или камень условно бессмертный и шанс чет там добыть есть именно при ударе? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Условно бессмертный. Скажем на пример каждый 2-5 удар дает 1 итем. Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

swat809в таком случае нужно метод onHit юзать, а не при смерти чекать. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прости конечно, а есть какой-то мануал? Или пример как это делать, я честно удивлен, что адекватно отвечают) спасибо.

2 часа назад, Rolo сказал:

swat809в таком случае нужно метод onHit юзать, а не при смерти чекать. 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

swat809не видел подобных мануалов. :) В целом нужно понимание как сборка построена, и джаву тоже понимать, иначе такое лучше самому не делать, я не в том даже ключе, что наугад не получится, - может и получиться, может даже все будет хорошо, но есть вероятность наплодить багов/загрузить систему, особенно если речь о вычислении шанса дропа на каждый удар. ) 

Если есть представления о джаве и что как работает, посмотрите в ядре, в классе l2PcInstance как устроены промахи/попадания по цели, например, или как вешается дебаф, когда бьешь РБ слишком лоу лвла, это все как раз чекается на каждый удар. 

Изменено пользователем Rolo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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);
                    }
                }
            }
        }
    }
}

Основной смысл думаю понятен.  Сообразишь

Изменено пользователем Khrome
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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);
                    }
                }
            }
        }
    }
}

Основной смысл думаю понятен.  Сообразишь

Низкий поклон, попробую

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...