Jump to content
Jigsaw

Соло камалока без премиума и вход в Delusion Chamber

Recommended Posts

 

Привет. Сборка First-Team H5 ( https://yadi.sk/d/4mPjaUKlFtCPk ).

Куда ковырять, что бы зайти в соло камалоку без премиума любому игроку?

Это не помогает:

# Solo kamaloka only for premium
KamalokaNightmaresPremiumOnly = False 

Скрипт инста:

Спойлер

package instances;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;

import l2ft.commons.threading.RunnableImpl;
import l2ft.gameserver.ThreadPoolManager;
import l2ft.gameserver.data.xml.holder.NpcHolder;
import l2ft.gameserver.idfactory.IdFactory;
import l2ft.gameserver.model.GameObject;
import l2ft.gameserver.model.GameObjectsStorage;
import l2ft.gameserver.model.Player;
import l2ft.gameserver.model.Spawner;
import l2ft.gameserver.model.entity.Reflection;
import l2ft.gameserver.network.l2.s2c.SystemMessage;
import l2ft.gameserver.templates.InstantZone;
import l2ft.gameserver.templates.StatsSet;
import l2ft.gameserver.utils.Location;
import npc.model.PathfinderInstance;

public class KamalokaNightmare extends Reflection
{
    private static final int PATHFINDER = 32485;

    private static final int RANK_1_MIN_POINTS = 500;
    private static final int RANK_2_MIN_POINTS = 2500;
    private static final int RANK_3_MIN_POINTS = 4500;
    private static final int RANK_4_MIN_POINTS = 5500;
    private static final int RANK_5_MIN_POINTS = 7000;
    private static final int RANK_6_MIN_POINTS = 9000;

    private final int _playerId;
    private Future<?> _expireTask;

    private int killedKanabions = 0;
    private int killedDoplers = 0;
    private int killedVoiders = 0;

    private int delay_after_spawn = 0;
    private boolean is_spawn_possible = true;

    public KamalokaNightmare(Player player)
    {
        _playerId = player.getObjectId();
    }

    @Override
    protected void onCreate()
    {
        super.onCreate();

        InstantZone iz = getInstancedZone();
        if(iz != null)
        {
            int time_limit = iz.getTimelimit() * 1000 * 60;
            delay_after_spawn = time_limit / 3;
            startPathfinderTimer(time_limit - delay_after_spawn); // спавн патчфиндера происходит через 2\3 прошедшего времени.
        }
    }
    
    @Override
    protected void onCollapse()
    {
        super.onCollapse();
        
        stopPathfinderTimer();
    }

    public void addKilledKanabion(int type)
    {
        switch(type)
        {
            case 1:
                killedKanabions++;
                break;
            case 2:
                killedDoplers++;
                break;
            case 3:
                killedVoiders++;
                break;
        }
    }

    public int getRank()
    {
        int total = killedKanabions * 10 + killedDoplers * 20 + killedVoiders * 50;
        if(total >= RANK_6_MIN_POINTS)
            return 6;
        else if(total >= RANK_5_MIN_POINTS)
            return 5;
        else if(total >= RANK_4_MIN_POINTS)
            return 4;
        else if(total >= RANK_3_MIN_POINTS)
            return 3;
        else if(total >= RANK_2_MIN_POINTS)
            return 2;
        else if(total >= RANK_1_MIN_POINTS)
            return 1;
        else
            return 0;
    }

    public void startPathfinderTimer(long timeInMillis)
    {
        if(_expireTask != null)
        {
            _expireTask.cancel(false);
            _expireTask = null;
        }

        _expireTask = ThreadPoolManager.getInstance().schedule(new RunnableImpl()
        {
            @Override
            public void runImpl()
            {
                try
                {
                    is_spawn_possible = false;
                    for(Spawner s : KamalokaNightmare.this.getSpawns().toArray(new Spawner[KamalokaNightmare.this.getSpawns().size()]))
                        s.deleteAll();

                    KamalokaNightmare.this.getSpawns().clear();

                    List<GameObject> delete = new ArrayList<GameObject>();
                    lock.lock();
                    try
                    {
                        for(GameObject o : _objects)
                            if(!o.isPlayable())
                                delete.add(o);
                    }
                    finally
                    {
                        lock.unlock();
                    }

                    for(GameObject o : delete)
                        o.deleteMe();

                    Player p = (Player) GameObjectsStorage.findObject(getPlayerId());
                    if(p != null)
                    {
                        p.getPlayer().sendPacket(new SystemMessage(SystemMessage.THIS_DUNGEON_WILL_EXPIRE_IN_S1_MINUTES).addNumber(delay_after_spawn / 60000));

                        InstantZone iz = KamalokaNightmare.this.getInstancedZone();
                        if(iz != null)
                        {
                            String loc = iz.getAddParams().getString("pathfinder_loc", null);
                            if(loc != null)
                            {
                                PathfinderInstance npc = new PathfinderInstance(IdFactory.getInstance().getNextId(), NpcHolder.getInstance().getTemplate(PATHFINDER));
                                npc.setSpawnedLoc(Location.parseLoc(loc));
                                npc.setReflection(KamalokaNightmare.this);
                                npc.spawnMe(npc.getSpawnedLoc());
                            }
                        }
                    }
                    else
                        collapse();
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }, timeInMillis);
    }

    public void stopPathfinderTimer()
    {
        if(_expireTask != null)
        {
            _expireTask.cancel(false);
            _expireTask = null;
        }
    }

    public int getPlayerId()
    {
        return _playerId;
    }

    @Override
    public boolean canChampions()
    {
        return false;
    }

    public boolean isSpawnPossible()
    {
        return is_spawn_possible;
    }
}

Xml инста:

Спойлер

<!DOCTYPE list SYSTEM "instances.dtd">
<list>
    <!-- Town of Schuttgart: NPC Pathfinder (Level 75) -->
    <instance id="56" name="Kamaloka, Hall of the Nightmares" maxChannels="10" collapseIfEmpty="10" timelimit="30" dispelBuffs="false">
        <collapse on-party-dismiss="true" timer="60"/>
        <level min="70" max="85"/>
        <party min="1" max="1"/>
        <return loc="42767 -48016 -800"/>
        <teleport loc="48137 -219716 -8752"/>
        <remove itemId="0" count="0" necessary="false"/>
        <give itemId="0" count="0"/>
        <quest id="0"/>
        <reuse resetReuse="30 6 * * *" setUponEntry="true" sharedReuseGroup="2"/>
        <add_parameters>
            <param name="pathfinder_loc" value="49052 -219762 -8752"/>
            <param name="reward_lvl_0" value="13002-8"/>
            <param name="reward_lvl_1" value="13002-8;10860-1"/>
            <param name="reward_lvl_2" value="13002-8;10861-1"/>
            <param name="reward_lvl_3" value="13002-8;10862-1"/>
            <param name="reward_lvl_4" value="13002-8;10863-1"/>
            <param name="reward_lvl_5" value="13002-8;10864-1"/>
            <param name="reward_lvl_6" value="13002-10;10865-1"/>
        </add_parameters>
        <spawns>
            <!-- Sword Kanabion -->
            <spawn mobId="22482" count="6" respawn="30" type="loc">
                <coords loc="48152 -218792 -8752 -8752"/>
                <coords loc="49896 -218792 -8752 -8752"/>
                <coords loc="49896 -220696 -8752 -8752"/>
                <coords loc="48152 -220696 -8752 -8752"/>
            </spawn>
        </spawns>
    </instance>
</list>

И еще херня. Есть конфиг:

# Включить альтернативное ограничение по количеству чаров в группе для входа в инстанс
# работает только на тех зонах где есть ограничения
AllowInstancesPartyManual = true
# Минимальное количество
InstancesPartyMin = 2
# Максимальное количество
InstancesPartyMax = 9

Так вот при попытке входа в инст в Delusion Chamber за минимальное количество игроков береться значение максимального. Как исправить? (Кроме  InstancesPartyMax = 2).

Edited by Jigsaw

Share this post


Link to post
Share on other sites

Ну в исходном коде наверное ошибка

Share this post


Link to post
Share on other sites

Проверку на премиум не в классе инстанса смотреть надо, а в классе нпс, который туда перемещает.

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

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...