Jump to content
Sign in to follow this  
swat809

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

Recommended Posts

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

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

Edited by swat809

Share this post


Link to post
Share on other sites

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


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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
15 часов назад, swat809 сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

Edited by Rolo

Share this post


Link to post
Share on other sites
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);
                    }
                }
            }
        }
    }
}

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

Edited by Khrome
  • Upvote 1

Share this post


Link to post
Share on other sites
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);
                    }
                }
            }
        }
    }
}

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...