Witam, dawno mnie nie było tutaj na forum i przyznam szczerze troszkę się stęskniłem :> Ale do rzeczy
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:
310Kronika:
InterludeChangelog:
http://acis.i-live.eu/index.php?topic=30.0Przepraszam moderatorów jeżeli to zły dział, lecz nie wiedziałem do czego to zaliczyć
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.sqlCREATE 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.javapackage 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