Witaj
Gość

Wątek: [Poradnik] Lineage 2: Interlude - L2aCis - Instancje  (Przeczytany 2625 razy)

  • Wiadomości: 15

  • Pochwał: 1

[Poradnik] Lineage 2: Interlude - L2aCis - Instancje
« dnia: Kwiecień 20, 2014, 10:56:33 pm »
Witam, dawno mnie nie było tutaj na forum i przyznam szczerze troszkę się stęskniłem :> Ale do rzeczy :D otóż wpadłem na pomysł aby przenieść system instancji z wyższych kronik na Interlude. Pomysł według mnie bardzo ciekawy i dający wiele nowych i ciekawych możliwości ;)

Podstawowe informacje:
Pliki: L2aCis - http://acis.i-live.eu/
Rewizja: 310
Kronika: Interlude
Changelog: http://acis.i-live.eu/index.php?topic=30.0

Przepraszam moderatorów jeżeli to zły dział, lecz nie wiedziałem do czego to zaliczyć :D

Otóż z początku miałem zamiar napisać krok po kroku instrukcję co, gdzie i jak pozmieniać w każdym pliku, ale doszedłem do wniosku że w sumie nie ma to sensu, gdyż zmian w plikach i samych edytowanych plików jest tak dużo że straciłoby to przejrzystość i zniechęciłoby każdego do przejścia tego poradnika. A więc wpadłem na pomysł aby wstawić gotowy plik .diff który uwzględnia całość modyfikacji, wraz z dodanymi przeze mnie plikami, ogólnie cały system został przeniesiony z projektu l2j T2.3, lecz wprowadziłem tam kilka poprawek i dostosowałem troszeczkę system do projektu aCis. Poniżej zamieszczę tylko instrukcję edycji Datapack, gdyż plik .diff modyfikuje tylko i wyłącznie Server.

Datapack/sql/character_instance_time.sql
CREATE TABLE IF NOT EXISTS `character_instance_time` (
`charId` INT UNSIGNED NOT NULL DEFAULT 0,
`instanceId` INT(3) NOT NULL DEFAULT 0,
`time` decimal(20) NOT NULL DEFAULT 0,
PRIMARY KEY(`charId`, `instanceId`)
);

Datapack/data/xml/instanceslist.xml
<?xml version="1.0" encoding="utf-8"?>
<list>
<instance id="1" name="Custom Instance">
<set name="activityTime" value="30" />
<set name="emptyDestroyTime" value="30" />
<set name="allowSummon" value="false" /> <!-- Znacznik nie wymagany. Domyślnie: true -->
<set name="isPvP" value="false" /> <!-- Znacznik nie wymagany. Domyślnie: false -->
<spawn x="83452" y="147970" z="-3405" heading="0" /> <!-- Znacznik ustala pozycję gracza w przypadku gdy zostanie wyrzucony siłą z instancji -->
<spawnlist> <!-- Znacznik nie wymagany -->
<spawn npcId="31230" x="82746" y="148406" z="-3469" heading="0" respawnDelay="0" />
</spawnlist>
<doorlist> <!-- Znacznik nie wymagany -->
<door id="0" isOpened="false" />
</doorlist>
</instance>
</list>

Tworzymy nową instancję:

Datapack/data/scripts/instances/CustomInstance/CustomInstance.java
package instances.CustomInstance;

import net.sf.l2j.gameserver.instancemanager.InstanceManager;
import net.sf.l2j.gameserver.instancemanager.InstanceManager.InstanceWorld;
import net.sf.l2j.gameserver.model.actor.L2Npc;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.quest.Quest;
import net.sf.l2j.gameserver.model.quest.QuestState;
import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;

public class CustomInstance extends Quest {
public static final String qn ="CustomInstance";

public static final int LOUIE_THE_CAT = 31230;

public static final int INSTANCE_ID = 1;

private class CustomInstanceWorld extends InstanceWorld {
public CustomInstanceWorld() {
InstanceManager.getInstance().super();
}
}

public CustomInstance(int questId, String name, String descr) {
super(questId, name, descr);

addStartNpc(LOUIE_THE_CAT);
addTalkId(LOUIE_THE_CAT);
addFirstTalkId(LOUIE_THE_CAT);
}

public void enterInstance(L2PcInstance player) {
InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player);
if(world != null) {
if(!(world instanceof CustomInstanceWorld)) {
player.sendPacket(SystemMessage.sendString("You have entered another instance zone, therefore you cannot enter corresponding dungeon."));
return;
}
} else {
world = new CustomInstanceWorld();
world.instanceId = InstanceManager.getInstance().createDynamicInstance(INSTANCE_ID);
world.templateId = INSTANCE_ID;
InstanceManager.getInstance().addWorld(world);
_log.info("CustomInstance: created new instance!");

player.setInstanceId(world.instanceId);
InstanceManager.getInstance().setInstanceTime(player.getObjectId(), world.instanceId, System.currentTimeMillis() + 86400000);
world.allowed.add(player.getObjectId());
player.teleToLocation(83452, 148538, -3405, 0);
}
}

public void exitInstance(L2PcInstance player) {
player.setInstanceId(0);
player.teleToLocation(83452, 147970, -3405, 0);
}

@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) {
String htmltext = event;
QuestState st = player.getQuestState(qn);

if(event.equalsIgnoreCase("enterInstance")) {
st.setState(STATE_STARTED);
htmltext = "31230-01.htm";
enterInstance(player);
} else if(event.equalsIgnoreCase("exitInstance")) {
st.setState(STATE_COMPLETED);
htmltext = "31230-02.htm";
exitInstance(player);
}

return htmltext;
}

@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player) {
QuestState st = player.getQuestState(qn);
if(st == null) {
st = newQuestState(player);
}

return "31230.htm";
}

public static void main(String[] args) {
new CustomInstance(-1, qn, "instances");
}
}

Datapack/data/scripts/instances/CustomInstance/31230.htm
<html><body>Louie the Cat:<br>
Welcome traveler! Here you can enter to CustomInstance! Would you like to enter?<br>
<a action="bypass -h Quest CustomInstance enterInstance">Enter Instance</a><br>
<a action="bypass -h Quest CustomInstance exitInstance">Exit Instance</a><br>
</body></html>

Datapack/data/scripts/instances/CustomInstance/31230-01.htm
<html><body>Louie the Cat:<br>
Good luck!
</body></html>

Datapack/data/scripts/instances/CustomInstance/31230-02.htm

<html><body>Louie the Cat:<br>
Thanks you adventurer!
</body></html>

Datapack/data/scripts.cfg
# Instances
instances/CustomInstance/CustomInstance.java

I to byłoby na tyle, pragnę zauważyć że instancja jest przeznaczona na instancję w centrum giran, to tylko do testów aby sprawdzić o co biega. Testowa instancja nie zawiera żadnych zabezpieczeń sprawdzających czy gracz jest w party, czy może wejść, czy nie jest w innej instancji itp. tym należy zająć się indywidualnie, poradnik miał na celu pokazanie podstaw związanych z tworzeniem instancji, po więcej informacji jak tworzyć zabezpieczenia itp. proszę zaglądnąć na svn projektu l2j.

To by było na tyle, myślę że poradnik przyda się każdemu i pozwoli na wstawienie systemu do swoich projektów. Na koniec chciałbym życzyć wszystkim Wesołych Świąt i mokrego Dyngusa, pozdrawiam ;)